我想在python中测试矢量化代码的性能:
import timeit
import numpy as np
def func1():
x = np.arange(1000)
sum = np.sum(x*2)
return sum
def func2():
sum = 0
for i in xrange(1000):
sum += i*2
return sum
def func3():
sum = 0
for i in xrange(0,1000,4):
x = np.arange(i,i+4,1)
sum += np.sum(x*2)
return sum
print timeit.timeit(func1, number = 1000)
print timeit.timeit(func2, number = 1000)
print timeit.timeit(func3, number = 1000)
Run Code Online (Sandbox Code Playgroud)
代码提供以下输出:
0.0105729103088
0.069864988327
0.983253955841
Run Code Online (Sandbox Code Playgroud)
第一和第二功能的性能差异并不令人惊讶.但我很惊讶第3个功能明显慢于其他功能.
我在C中的代码中比在Python中更熟悉,第三个函数更像C - 运行for循环并在每个循环中的一条指令中处理4个数字.根据我的理解,numpy调用C函数,然后在C中对代码进行矢量化.因此,如果是这种情况,我的代码也会一次传递4个数字到numpy.当我一次传递更多数字时,代码应该不会更好.那为什么它要慢得多呢?是因为调用numpy函数的开销?
再说,我即使摆在首位的第三个功能上来的原因是因为我担心大量内存分配的性能x中func1.
我的担心有效吗?为什么以及如何改进它或为什么不改进?
提前致谢.
编辑:
出于好奇的缘故,虽然它打破了我创建第3版的最初目的,但我已经研究了roganjosh的建议,并尝试了以下编辑. …