3

F# 通常被提升为一种函数式语言,默认情况下数据是不可变的,但是 F# Powerpack 中的矩阵和向量类型的元素是可变的。为什么是这样?

此外,与普通矩阵相比,稀疏矩阵实现为不可变的原因是什么?

4

2 回答 2

4

F# 中的标准数组类型 ( 'T[]) 也是可变的。您基本正确 - F# 是一种鼓励数据不变性但不是必需的函数式语言。基本上,F# 允许您编写可变/命令式代码和不可变/功能性代码;由您决定为您的特定应用程序实现代码的最佳方式。

拥有可变数组和矩阵的另一个原因是性能——可以使用不可变类型实现非常快速的算法,但编写科学计算的用户通常只关心一件事:实现最大性能。在这种情况下,数组和矩阵应该是可变的。

于 2013-04-11T16:48:21.483 回答
3

对于真正的高性能,在一种特定情况下需要可变性:如果您的代码经过完美优化,并且您掌握了它所做的一切,直到您的程序访问缓存(L1,L2)模式,那么没有什么比低水平,以金属方式。

这种情况通常只发生在你有一个明确的问题并保持 20 年不变的情况下,也就是主要在科学任务中。

一旦你离开这个特定的案例,在 99.99% 的情况下,瓶颈来自于具有太低级别的表示(由低级别语言引起),在这种情况下你无法表达你的最终的、现实世界的优化权衡手头的问题。

底线,对于性能,以下方法是唯一的方法(我认为):

  • 高级/算法优化优先
  • 一旦探索了每一个高级方法,低级优化

您可以看到结果如何:

  • 你不应该在没有首先衡量影响的情况下优化任何东西:只有在它们产生巨大的性能提升和/或不会降低你的域逻辑时才应该进行改进。

  • 如果您的问题是稳定且明确定义的,您最终将达到一个点,您别无选择,只能进入低级别,并使用内存/可变性

于 2013-04-11T17:23:37.427 回答