Python / Numpy数组运算的性能如何随着数组尺寸的增加而缩放?


21

Python / Numpy数组如何随着数组尺寸的增加而缩放?

这是基于我在对这个问题进行Python代码基准测试时发现的一些行为:如何使用numpy slices表达这种复杂的表达式

问题主要涉及索引以填充数组。我发现在Python循环上使用(不太好)Cython和Numpy版本的优势因涉及的数组大小而异。Numpy和Cython都在一定程度上提高了性能优势(在我的笔记本电脑上,Cython 大约为,Numpy 大约为N = 2000),之后它们的优势下降了(Cython功能仍然是最快的)。N=500N=2000

是否定义了此硬件?在处理大型阵列方面,对于那些对性能表现满意的代码,应该遵循哪些最佳实践?

矢量化和Cython实现的相对于循环代码的执行时间图

这个问题(为什么我的矩阵向量乘法缩放不为什么?)可能是相关的,但是我有兴趣了解更多有关Python处理数组的不同方式如何相对缩放的信息。


您尝试过numexpr吗?例如,还有一个话题指向bloscCArray,它们都是为了进一步加快速度(并可能绕过内存带宽限制)。
0 0

1
您可以发布用于配置文件的代码吗?这里可能发生了一些事情。
meawoppl 2013年

Answers:


5

416ķ

def timeit(size):
     t0 = time.time()
     for _ in xrange(10):
         np.random.random(size)
     return time.time() - t0

sizes = np.logspace(1, 6, 40)
times = [timeit(s) for s in sizes]

此基准有一些问题,首先,我没有禁用垃圾收集,而是花了总和,不是最好的时间,但请多多包涵。

800064ķ

应该担心缓存大小吗?一般来说,我不会。在Python中对其进行优化意味着使代码更加复杂,从而获得可疑的性能提升。不要忘记,Python对象增加了一些难以跟踪和预测的开销。我只能想到这是两个相关因素的情况:

  • 大型数组的基本运算(例如评估多项式)受内存带宽的限制。使用Numexpr或(如果数据大得多)Pytables。除其他优化外,还对它们进行了优化以考虑缓存大小。
  • 关键性能代码:如果要每微秒压缩一次,则首先不要使用Python。编写矢量化的Cython并让编译器执行其最擅长的工作可能是最轻松的方法。

在评论中,Evert提到了CArray。请注意,即使工作正常,开发也已停止,并且已被放弃为独立项目。该功能将包含在Blaze中Blaze正在进行中,旨在制造“新一代Numpy”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.