你如何使用gcloud的多CPU来加速你的程序与Python?



为了使用Python在mac上获得更高的速度,我使用了fork功能。我的mac有4个内核,我注意到如果我使用4个分叉,我的程序速度会提高3.7倍。任何额外的分叉都不会使程序更快。我甚至不确定成功的分叉是否取决于核心的数量,事实上,我对真正发生的事情知之甚少,我只知道它是有效的。我意识到在gcloud上vCPU=5并不一定意味着有5个内核,但我希望更多的CPU能以某种方式帮助分叉过程更快。无论如何,我把下面的python程序放在一台16vCPU的gcloud计算机上,我没有看到速度的提高。以下程序的计数仅为250000000。在我的mac上使用4个分叉需要16秒,但在16vCPU gcloud上使用16个分叉需要18秒。

import functools, time, os
p = print

def print_intervals(number, interval, fork=None, total=0, print=True):
if number > 0 and number % interval == 0 and number >= interval:
if total:
per = int((number / total) * 100)
number = f"{number} - {per}%"
if fork == None:
p(number)
else:
p(f"fork {fork}")
p(number)
return
def timer(func):
"""Print the runtime of the decorated function"""
@functools.wraps(func)
def wrapper_timer(*args, **kwargs):
start_time = time.perf_counter()
value = func(*args, **kwargs)
end_time = time.perf_counter()
run_time = end_time - start_time
run_time = round(run_time, 2)
print(f"Finished {func.__name__!r} in {run_time} secs")
return value
return wrapper_timer
@timer
def temp1(**kwargs):
start = kwargs['start']
stop = kwargs['stop']
fork_num = kwargs['fork_num']
for x in range(start, stop):
print_intervals(x, 10_000_000)
z = x + 1
p(f'done fork {fork_num}')

def divide_range(divisions: int, total: int, idx: int):
sec = total // divisions
start = idx * sec
if total % divisions != 0 and idx == divisions:
stop = total
else:
stop = start + sec
return start, stop

def main_fork(func, total, **kwargs):
forks = 16
fake = kwargs.get("fake")
for i in range(forks):
start1, stop1 = 0, 0
if total != -1:
start1, stop1 = divide_range(forks, total, i)
p(f'fork num {i} {start1} {stop1}')
if not fake:
newpid = os.fork()
kwargs['start'] = start1
kwargs['stop'] = stop1
kwargs['fork_num'] = i
if fake and i > 0:
pass
elif fake:
func(**kwargs)
elif newpid == 0:
child(func, **kwargs)
return

def child(func, **kwargs):
func(**kwargs)
os._exit(0)

main_fork(temp1, 250_000_000, **{})

我再试了一次,这次成功了。一台16vCPUN1的机器将程序加速了5倍。我不确定我做了什么不同,但我唯一能想到的是,当我以为我在使用16vCPU计算机时,我实际上在使用1vCPU计算机。

不过,您可能希望看到内置的multiprocessing库。

Python是在多核CPU出现之前创建的,所以它在一个线程上运行——无论运行多少threading.Thread实例。

使用multiprocessing库时,您有效地运行了Pythonx的次数。例如,您将在CPU的每个核心上运行一个不同的Python实例,以将速度提高一个可余量。

最新更新