<p>有很多方法可以加速。这里有一个使用<code>pandas</code>的解决方案(也许也可以只使用<code>numpy</code>)。你知道吗</p>
<p>在这段代码中,<code>f1()</code>是您的原始函数,<code>f2()</code>使用的是<code>pandas</code>。你知道吗</p>
<pre><code>import numpy as np
import pandas as pd
import time
def f1(data):
t_start = time.perf_counter()
offset = 0
sum_1 = 0.0
while offset < data.shape[0]:
if data[offset + 1] <= 10:
sum_1 += data[offset + 1] * 0.1
else:
sum_1 += data[offset + 0] * 0.01
offset += 2
n = data.shape[0] / 2
avg_1 = sum_1 / n
t_end = time.perf_counter()
return {
'calc_time': t_end - t_start,
'n': n,
'sum': sum_1,
'avg': avg_1,
}
def f2(data):
t_start = time.perf_counter()
df = pd.DataFrame()
df['adc0'] = data[0::2] # every second element, starting at 0
df['adc1'] = data[1::2] # every second element, starting at 1
df['sum_value'] = np.where(
df['adc1'] <= 10,
df['adc1'] * 0.1,
df['adc0'] * 0.01)
sum_1 = df['sum_value'].sum()
n = df.shape[0]
avg_1 = sum_1 / n
t_end = time.perf_counter()
return {
'calc_time': t_end - t_start,
'n': n,
'sum': sum_1,
'avg': avg_1,
}
if __name__ == '__main__':
numbers = np.random.randint(0, 20, size=(2*1000*1000))
r = f1(numbers)
print(r)
r = f2(numbers)
print(r)
</code></pre>
<p>这段代码显示<code>f2()</code>更快,使用了大约<code>123 ms</code>(少于<code>f1()</code>时间的10%)。你知道吗</p>
<pre><code># f1
{'avg': 0.31791369000003045, 'n': 1000000.0, 'sum': 317913.69000003044,
'calc_time': 4.765112441743648}
# f2
{'avg': 0.31791368999999986, 'n': 1000000, 'sum': 317913.68999999989,
'calc_time': 0.12356162259120662}
</code></pre>
<p><strong>Obs:</strong>我假设这两个函数之间的<code>sum</code>和<code>avg</code>的差异源于如何处理浮点精度,但我不确定。
对于您的用例,您需要考虑几个小数位?这个小小的差别重要吗?你知道吗</p>