2011-12-02 60 views
5

我看到类似这样的问题,但没有一个直接解决问题。 我已经计算了以下两种填充数组的方法,使用np.zeros()的一半时间更快,一半时间直接执行更快。 有没有更好的方法?我对使用numpy数组相当陌生,并且已经参与加快我的代码的目标,而没有过多考虑可读性。填充1D numpy阵列的最快方法

import numpy as np 
import time 

lis = range(100000) 

timer = time.time() 
list1 = np.array(lis) 
print 'normal array creation', time.time() - timer, 'seconds' 

timer = time.time() 
list2 = np.zeros(len(lis)) 
list2.fill(lis) 
print 'zero, fill - array creation', time.time() - timer, 'seconds' 

谢谢

+0

的Python的方式进行基准测试的执行速度是使用['timeit'](http://docs.python.org /library/timeit.html)模块。 – mac

+0

@mac好的我从现在开始使用它。这几乎是第一次/我的配置文件(cProfiler),我需要时间我的功能 – Anake

回答

5

如果你有花车a=[x/10. for x in range(100000)]的列表,那么你可以创建一个数组:

np.array(a) # 9.92ms 
np.fromiter(a, dtype=np.float) # 5.19ms 

你的方法

list2 = np.zeros(len(lis)) 
list2.fill(lis) 

将无法​​正常工作如预期。 .fill用一个值填充整个数组。

+0

抱歉应该更加明确,这个代码只是为了测试速度,它会充满真实的数据,当我要使用它时。 (数据点将浮动) – Anake

+1

对于'np.array'与'np.fromiter'我很惊讶,第二个更快。如果它是一个迭代器,numpy首先不会知道要分配多少内存。 (它必须检查它是否可以得到一个长度。)更好的性能是因为你告诉numpy要使用的显式类型。如果你将dtype传递给'np.array',那会更快。 – AFoglia

1

您的list2示例根本不起作用 - 如果您检查list2,则会发现它仍包含全零。我发现追求可读性本身不仅仅是一个好目标。它也会导致正确代码的可能性增加。

+3

应该是一个评论... :) – mac

+0

哎呀,实际上并没有检查它的工作原理。感谢那 – Anake

1

第一个列表可以创建与arange numpy的功能更快:

list3 = np.arange(100000)

您也可以找到有用的linspace功能。

2

np.fromiter如果给定元素的数量将预先分配输出数组:

a = [x/10. for x in range(100000)] # 10.3ms 
np.fromiter(a, dtype=np.float) # 3.33ms 
np.fromiter(a, dtype=np.float, count=100000) # 3.03ms