我有三个列表,我使用了一个列表解析的总和,然而,由于这些列表的长度n〉= 1500,我无法让我的代码运行得比每个列表解析3s更高效,这段代码需要运行数千次,所以3s per并不能解决问题。
下面是我当前的尝试。split
只是我代码前面确定的一个浮点数。
sum([list1[k] * (list2[k] == 1) if list3[k] < split else list1[k] * (list2[k] == -1) for k in range(n)])
list1
包含1500个0到1之间的正浮点数,其总和为1。list2
包含1500个随机抽样的-1和1。list3
包含来自正态分布的1500个随机采样值,例如np.random.normal(5, 0.5, 3)
。
1条答案
按热度按时间qyswt5oh1#
我最后针对你的问题写了三种方法:改进了Python,麻木和numba。
zip
对性能的影响非常大。njit
,prange
等)感到轻松自如,numba通常是最快的解决方案,它比numpy方法需要更多的校对,但它得到了很好的回报。请注意,这些只是实现同一算法的不同方法,如果你在追逐那些宝贵的毫秒,改进一个低效的算法也是非常重要的。
| * * 项目**| * * 列出理解**| * * 压缩迭代器**| * * 数值数组**| * * 伦巴·尼Git**| * * 数字. njit(并行=真)**|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 1千|0.191毫秒|0.129毫秒|0.487毫秒|0.006毫秒|0.013毫秒|
| 10千|2.288毫秒|1.206毫秒|0.477毫秒|0.048毫秒|0.019毫秒|
| 10万|十八点九四一毫秒|十三点二四五毫秒|2.857毫秒|0.477毫秒|0.056毫秒|