公共部分
def solve(n):
step = 0
while n != 1:
if n % 2 == 0:
n //= 2
else:
n = 3 * n + 1
step += 1
return step
N = 1000000
v1
没啥好说的 顺序求解
主要代码:
x = [i for i in range(1, N + 1)]
y = list(map(solve, x))
v2
测试电脑为6C12T 故采用max_workers=12
主要代码:
from concurrent.futures import ThreadPoolExecutor
x = [i for i in range(1, N + 1)]
with ThreadPoolExecutor(max_workers=12) as e:
y = list(e.map(solve, x))
v3
主要代码:
import numpy as np
x = np.arange(1, N + 1, 1)
y = solve(x)
np.vectorize版:
import numpy as np
x = np.arange(1, N + 1, 1)
solve_vector = np.vectorize(solve)
y = solve_vector(x)
测试结果
+njit指给solve()函数加上了@njit标签
+vectorize指给solve()函数加上了@vectorize()标签
numpy不带(vec)指使用numba的#vectorize()标签而不使用np.vectorize 反之亦然
总结
用numba就完事了
最后放张算出来的图吧
