Я знаю, что вы хотите 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
будет иметь преимущество здесь .. Кто-нибудь знает, почему он тащит?
Update:
со 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 будут намного быстрее. В противном случае вы не увидите большой разницы для одной операции, так как большая часть времени будет съедена, преобразуя список в массив. –