我正在写一个简单的素数计算器,我正在努力使它尽可能快。我一直在研究python中的multiprocessing
,而且我所看到的每一个地方,似乎打开4个进程将启动4个线程。。。这是有道理的。但是,当运行以下代码时,即使有4个进程处于打开状态,我也只能得到1个进程(在top/Activity Monitor(Mac)/etc中)。我将primesPerThread
设置为500,这样进程在完成之前将持续更长的时间,以便我可以查找它们(在top/etc中)。但是,我只看到一个Python进程使用大约100%的CPU。在multiprocessing
中是否有我不理解/使用的东西?到目前为止,我得到的是:
import multiprocessing
import math
import os
import time
def mod(numerator, denominator):
result = numerator % denominator
return result
def checkPrimes(low, high):
global primes
reult = 0
curPrime = low
notPrime = False
for i in range(low, high):
notPrime = False
for j in range(int(math.floor(math.sqrt(len(primes))))):
result = mod(curPrime, primes[j])
if result == 0:
notPrime = True
break
if not notPrime:
primes.append(curPrime)
curPrime += 1
cores = 4
primes = [2,3]
curPrime = 4
result = 0
notPrime = False
primesPerThread = 500
numPrimes = 0
prevNumPrimes = 0
processes = []
while len(primes) < 1000000:
for c in range(0, cores):
low = curPrime
high = curPrime + primesPerThread
process = multiprocessing.Process(target=checkPrimes(low, high))
process.start()
processes.append(process)
curPrime += primesPerThread
for process in processes:
process.join()
prevNumPrimes = numPrimes
numPrimes = len(primes)
print(len(primes))
# for i in range(numPrimes - prevNumPrimes, 0, -1):
# os.popen("echo " + str(primes[len(primes) - i]) + " >> primes.txt")
多处理不是线程!顾名思义,它使用不同的进程而不是线程。因此,使用全局变量是行不通的,因为它不是在进程之间共享的。在
使用列表理解通常是for循环的先决条件,因为它更快。考虑一下这一点
这个算法只需0.6秒就可以找到前10万个数中的素数。当然,当你把要搜索的数字列得更长时,这个时间会迅速攀升;你必须检查所有奇数直到√c
^{pr2}$您可以通过向
prime_list
添加要检查的最小数目,然后使用multiprocessing.Pool
对象中的map
方法将工作分散到多个实例上。在这样可以得到:
相关问题 更多 >
编程相关推荐