为什么F#Powerpack中的矩阵元素和矢量类型是可变的?

eomnis 发布于 2019-03-09 f# 最后更新 2019-03-09 14:39 3 浏览

F#经常被提升为一种功能语言,默认情况下数据是不可变的,但是F#Powerpack中的矩阵和向量类型的元素是可变的。为什么是这样? 此外,为什么稀疏矩阵作为不可变的实现而不是正常的矩阵?

已邀请:

get

赞同来自:

F#中的标准数组类型('T[])也是可变的。你大多是正确的 - F#是一种功能语言,鼓励数据不变性,但不是必需的。基本上,F#允许您编写可变/命令式代码和不可变/功能代码;由您来决定为您的特定应用程序实现代码的最佳方法。 具有可变数组和矩阵的另一个原因是性能 - 可以使用不可变类型实现非常快速的算法,但编写科学计算的用户通常只关心一件事:实现最大性能。在这种情况下,数组和矩阵应该是可变的。

kodit

赞同来自:

对于真正的高性能,在一个特定情况下需要可变性:假设您的代码经过了完美优化,并且您掌握了程序访问缓存(L1,L2)模式的所有内容,那么没有什么比低水平,对金属方法。 这种情况主要发生在你有一个指定的问题保持不变20年,主要是科学任务。 一旦你离开这个特定的情况,99.99%的瓶颈就是由于过低的代表性(由低水平的语言引起),你无法表达你的最终,现实世界的优化权衡手头的问题。 最重要的是,对于性能,以下方法是唯一的方法(我认为):

  • 首先是高级/算法优化
  • 一旦探索了每个高级方法,低级优化
你可以看到如此结果:
  • 如果没有FIRST衡量影响,你绝不应该优化任何事情:只有在它们产生巨大的性能提升和/或不降低域逻辑的情况下才能进行改进。
  • 如果你的问题稳定且定义明确,你最终会达到这样的程度,你将别无选择,只能进入低级别,并使用记忆/可变性