繁体   English   中英

向量数学— numpy与迭代器

[英]vector math — numpy vs iterators

下面的代码显示,迭代器比numpy.arrays快得多(除非我做错了什么)。

import numpy as np
import itertools
import time

dim = 10000
arrays = [np.array((1, 2, 3)) for x in range(dim)]
iterators = [iter((1, 2, 3)) for x in range(dim)]

t_array = time.time()
print(sum(arrays))
print(time.time() - t_array)

# [10000 20000 30000]
# 0.016389131546020508


t_iterators = time.time()
print(list(sum(x) for x in zip(*iterators)))
print(time.time() - t_iterators)

# [10000, 20000, 30000]
# 0.0011029243469238281

并且迭代器版本不仅适用于迭代器,而且适用于np.arrays,列表或元组。

因此,这是提出客观问题的地方,我猜测存在一个客观原因,即numpy经常用于这种事情(根据我在互联网上看到的情况)。

那是什么原因 还是我客观上做错了?

问题是:

arrays = [np.array((1, 2, 3)) for x in range(dim)]

不是数组,这是:

sum(arrays)

不是numpy的操作。

将时序与数组列表和内置sum

>>> timeit.timeit('sum(arrays)', 'from __main__ import arrays', number=1000)
16.348400657162813

到二维数组和numpy.sum

>>> actual_array = numpy.array(arrays)
>>> timeit.timeit('numpy.sum(actual_array, axis=0)', 'from __main__ import actua
l_array; import numpy', number=1000)
0.20679712685881668

改进了80倍。 它比迭代器版本高出5倍。如果要使用NumPy,则需要在NumPy中保持尽可能多的工作。

我会说您做错了,但这是一个解释问题,取决于您要解决的问题的细节。

对于这种情况,您将二维numpy数组存储为numpy数组的列表,然后使用“列表处理”例程。 这避免了numpy可能带来的一些好处/优化。

下面提供了在ipython中运行的案例的略微修改版本(不运行%pylab)。 请注意,在示例中您没有使用itertools,而是使用内置的iter()函数。

import numpy as np

dim = 10000
arrays = [np.array((1, 2, 3)) for x in range(dim)]
iterators = [iter((1, 2, 3)) for x in range(dim)]

%timeit sum(arrays)
10 loops, best of 3: 20.8 ms per loop

%timeit list(sum(x) for x in zip(*iterators))
1000 loops, best of 3: 468 µs per loop

[根据下面的评论编辑。]

因此,迭代器看起来不错,但它们的局限性在于只能使用一次。 在我们遍历它们之后,它们现在是“空的”。 因此,使用%timeit进行正确的测试将是每次都重新创建迭代器。

def iter_test () :
    iterators = [iter((1, 2, 3)) for x in range(dim)]
    return list(sum(x) for x in zip(*iterators))

%timeit iter_test()
100 loops, best of 3: 4.06 ms per loop

现在,我们看到它(仅)比遍历数组快大约5倍。

在纯numpy中,我将改为执行以下操作(可以以多种方式创建二维数组)

nparrays=np.asarray(arrays)
%timeit np.sum(nparrays,axis=0)
1000 loops, best of 3: 279 µs per loop

因此,这更快,因为它应该是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM