|
发表于 2017-10-13 15:14:45
|
显示全部楼层
本帖最后由 gunjang 于 2017-10-13 15:18 编辑
@jerryxjr1220
虽然已经评比结束了,但是借鉴兄的素数筛法思路,优化到60s
感觉组合算法还有优化空间,有很多重复~~~
感觉numpy使用的好,优化效率很高,同样的sum,自己迭代13s,python的sum溢出,np.sum只要0.14s,估计这就是解释型语言和编译语言的差距,百倍
- #http://bbs.fishc.com/forum.php?mod=viewthread&tid=97298
- import time
- import numpy as np
- st = time.time()
- def genPerfectPrimes():
- primes = np.ones(10**8, dtype=np.bool)
- for i in range(2, int((10**8)**0.5)+1):
- if primes[i]: primes[i*i::i] = False
- primes[0], primes[1] = False, False
- print('generate primes(<10billion) cost %ss' %(time.time()-st)) #2.8s
- combprimes = primes.copy() # one or more primes
- pprimes = np.zeros(10**8, dtype=np.bool)
- cplist = [[] for i in range(9)]
- cplist[1] = [2,3,5,7]
- for digitno in range(2, 8+1):
- t1 = time.time()
- for currdigitno in range(1, digitno):
- currlist = cplist[currdigitno]
- for nextdigitno in range(1, digitno-currdigitno+1):
- nextlist = cplist[nextdigitno]
- currmul = 10**(digitno-currdigitno)
- for curr in currlist:
- curr *= currmul
- for nt in nextlist:
- num = curr + nt
- combprimes[num] = True
- if primes[num]:
- pprimes[num] = True
- if digitno != 8:
- cplist[digitno] = np.nonzero(combprimes[10**(digitno-1):10**digitno])[0]+10**(digitno-1)
-
- print('DigitNo=%d cost %ss' %(digitno, time.time()-t1))#8 cost 57s
- t1 = time.time()
- r = np.nonzero(pprimes)[0].astype(np.int64).sum() #must astype, use sum(...) may #overflow encountered in int_scalars
- print('calculte sum cost %ss' %(time.time()-t1)) #13s
- return r
- #23419 when <10000
- print(genPerfectPrimes()) #122975378089761 count is 2409775
- print(time.time()-st) #545s => 61s
复制代码 |
评分
-
查看全部评分
|