簡體   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