为什么Python要在多处理中提前计算一些计算呢

2024-05-03 18:14:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是带有英特尔处理器的Ubuntu 17.04 64位® 核心™ i7-7500U CPU@2.70GHz× 4和16gb RAM。
所以当我运行这个程序时,它使用一个内核,而不是所有的4个内核

import time
import multiprocessing

def boom1(*args):
    print(5**10000000000)

def boom2(*args):
    print(5**10000000000)   

def boom3(*args):
    print(5**10000000000)   

def boom4(*args):
    print(5**10000000000)

if __name__=="__main__":
    array = []
    p1 = multiprocessing.Process(target=boom1, args=(array,))
    p2 = multiprocessing.Process(target=boom2, args=(array,))
    p3 = multiprocessing.Process(target=boom3, args=(array,))
    p4 = multiprocessing.Process(target=boom4, args=(array,))

    p1.start()
    p2.start()
    p3.start()
    p4.start()


    p1.join()
    p2.join()
    p3.join()
    p4.join()

    print('Done')

现在,如果我在每个函数中打印10的低功耗:

print(5 ** 10000000)

现在,在很短的一段时间内,一个核处理100%,然后所有4个核都执行100%。 为什么会这样?它不应该从所有核心都执行100%开始吗

我所知道的是,python在自身之前执行一些操作,因此是从单个核心执行这些操作的。如果是这样的话,那么python作为一种解释语言有什么意义呢?或者我遗漏了什么吗


Tags: target核心defargsmultiprocessingarrayprocess内核
3条回答

我相信前面的答案是正确的,但可能不能完全解释你的观察结果。正如其他人指出的,您看到的单处理器时间是解释器计算指数表达式值所花费的时间。因为您使用的是整数,而Python可以处理任意长的整数,所以这需要相当长的时间,可能是指数中0的数量的指数。在第一种情况下,计算耗时太长,似乎无法完成(我不知道您是否已经完成了计算,或者您的计算机是否可以在没有内存耗尽的情况下完成计算)

在第二种情况下,您已经删除了足够多的零,以便它可以计算它(单线程解释器),然后继续打印它(并行)。不管花了多长时间,第一个病例可能至少需要1000倍的时间

大多数语言都有常量折叠优化:当出现常量之间的操作时,编译器将执行该操作并用单个常量结果替换表达式

Python也能做到这一点。我希望您的多节点操作只是在每个节点上启动print join的序列

如果要在四个节点上获得更长的运行时间,请尝试在解析时无法计算的表达式。例如,在参数列表中传递基数并使用它而不是5,或者让每个进程在1-10范围内选择一个随机数并将其添加到指数中。这将强制运行时评估

窥视孔优化器正在尝试常量折叠5**10000000000计算。这发生在任何工作进程启动之前

相关问题 更多 >