为什么生成一个进程会使计算 运行 快两倍?
Why would spawning a process make computation run twice as fast?
以下计算在我的 Precision 5520 上大约需要 10.4 秒:
import time
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
在同一台笔记本电脑上,以下只需要 5.2 秒:
import multiprocessing as mp
import time
def foo():
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
mp.Process(target=foo).start()
这个结果是一致的。事实上,即使我 运行 cpu_count
同时处理,它也成立(加速因子略小)。
那么,为什么生成一个进程会使计算 运行 快两倍?
不是让计算变快的过程,而是运行在一个函数中进行计算。这是因为 全局变量访问比使用 CPython 解释器的局部变量访问慢 。如果你在同一个过程中简单地 运行 foo()
,那么计算时间也会减少两倍。这是一个例子:
import time
def foo():
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
# Slow (8.806 seconds)
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
# Fast (4.362 seconds)
foo()
注意覆盖 built-in 函数 sum
有点危险,因为它可能会破坏使用它的代码并导致奇怪的错误。
以下计算在我的 Precision 5520 上大约需要 10.4 秒:
import time
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
在同一台笔记本电脑上,以下只需要 5.2 秒:
import multiprocessing as mp
import time
def foo():
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
mp.Process(target=foo).start()
这个结果是一致的。事实上,即使我 运行 cpu_count
同时处理,它也成立(加速因子略小)。
那么,为什么生成一个进程会使计算 运行 快两倍?
不是让计算变快的过程,而是运行在一个函数中进行计算。这是因为 全局变量访问比使用 CPython 解释器的局部变量访问慢 。如果你在同一个过程中简单地 运行 foo()
,那么计算时间也会减少两倍。这是一个例子:
import time
def foo():
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
# Slow (8.806 seconds)
before = time.time()
sum = 0
for i in range(1, 100000000):
sum += i
print(time.time() - before, sum)
# Fast (4.362 seconds)
foo()
注意覆盖 built-in 函数 sum
有点危险,因为它可能会破坏使用它的代码并导致奇怪的错误。