我使用的是带有英特尔处理器的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作为一种解释语言有什么意义呢?或者我遗漏了什么吗
我相信前面的答案是正确的,但可能不能完全解释你的观察结果。正如其他人指出的,您看到的单处理器时间是解释器计算指数表达式值所花费的时间。因为您使用的是整数,而Python可以处理任意长的整数,所以这需要相当长的时间,可能是指数中0的数量的指数。在第一种情况下,计算耗时太长,似乎无法完成(我不知道您是否已经完成了计算,或者您的计算机是否可以在没有内存耗尽的情况下完成计算)
在第二种情况下,您已经删除了足够多的零,以便它可以计算它(单线程解释器),然后继续打印它(并行)。不管花了多长时间,第一个病例可能至少需要1000倍的时间
大多数语言都有常量折叠优化:当出现常量之间的操作时,编译器将执行该操作并用单个常量结果替换表达式
Python也能做到这一点。我希望您的多节点操作只是在每个节点上启动print join的序列
如果要在四个节点上获得更长的运行时间,请尝试在解析时无法计算的表达式。例如,在参数列表中传递基数并使用它而不是5,或者让每个进程在1-10范围内选择一个随机数并将其添加到指数中。这将强制运行时评估
窥视孔优化器正在尝试常量折叠
5**10000000000
计算。这发生在任何工作进程启动之前相关问题 更多 >
编程相关推荐