我知道你想要一個numpy
的解決方案,所以這不符合該標準(@ eumiro的早期的崗位肯定不會),但只是作爲一種替代,這裏至少是一個優化的Python版本,令人驚訝的(我)竟然相當快!
speeds = [i for i in speed if i > 0]
return sum(speeds)/(1.0 * len(speeds)) if sum(speeds) > 0 else 0.0
在速度方面比較這與numpy(或原始)實現可能會有趣。
In [14]: timeit original(speed) # original code
1000 loops, best of 3: 1.13 ms per loop
In [15]: timeit python_opt(speed) # above Python 2 liner
1000 loops, best of 3: 582 us per loop
In [16]: timeit avg_positive_speed(speed) # numpy code
1000 loops, best of 3: 1.2 ms per loop
其中
speed = range(10000)
我本來以爲numpy
將有這裏邊..任何人都知道爲什麼落後?
更新:
與speed = range(100000)
:
In [19]: timeit original(speed)
100 loops, best of 3: 12.2 ms per loop
In [20]: timeit python_opt(speed)
100 loops, best of 3: 11 ms per loop
In [21]: timeit avg_positive_speed(speed)
100 loops, best of 3: 12.5 ms per loop
還是不相信這numpy
是這個特定問題的好工具,除非有一個巨大的數速度:)
numpy如何處理內存?列表理解在某些時候會遇到一些限制。
嘗試較大的數字。在1000的情況下,從列表到數組的轉換主導着時間。 –
@JoeKington只是現在這樣做.. :) – Levon
請記住,大列表轉換爲numpy數組是一個相對緩慢的過程。如果數據已經是一個numpy數組(它使用_far_少於列表的內存),那麼numpy版本會更快。否則,對於單個操作,您將看不到大的差異,因爲大部分時間都將被用於將列表轉換爲數組。 –