下面的Python
代码在about 2 sec
中执行。在6 ms
中执行C
中的等效代码。
一些解释:我有2个ADC
通道(adc0
,adc1
,adc0
,adc1
,...)的串行数据。如果是adc1 <= 10
,我必须将adc1
加到和上,否则我必须加adc0
。这些值乘以不同的系数(0.1
和0.01
)。
#!/usr/bin/env python
import time
import numpy as np
dd = np.random.randint(0, 20, size=(2*1000*1000))
t_start = time.clock()
avg_sum1 = 0.0
BlockOffset = 0
while BlockOffset < len(dd):
if dd[BlockOffset + 1] <= 10:
avg_sum1 += dd[BlockOffset + 1] * 0.1
else:
avg_sum1 += dd[BlockOffset + 0] * 0.01
BlockOffset += 2
print('Avg: ' + str(avg_sum1 / len(dd) / 2))
print('Exe time: ' + str(time.clock() - t_start))
使用内置函数或numpy
执行此操作最快的方法是什么
发布于 2018-07-30 04:04:13
首先,你需要修正你的平均计算(运算符优先级):
avg_sum1 / (len(dd) / 2) # or avg_sum1 / len(dd) * 2
Out[]:
0.31740819000001924
2.8 s ± 28.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
您可以在numpy
中执行此操作,例如:
In []:
np.where(dd[1::2] <= 10, dd[1::2]*0.1, dd[0::2]*0.01).mean()
Out[]:
0.31740818999999987
10.8 ms ± 61.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
https://stackoverflow.com/questions/51559330
复制相似问题