我知道你想要一个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 如何处理内存?列表理解在某些时候会遇到一些限制。