这个问题涉及项目欧拉,问题10:总结低于200万的所有素数。在我使用正确的算法之前,程序非常慢,所以我决定将它找到的素数分批写入数据文件。现在我有正确的主算法,但原则上我想知道如何附加数据文件。
#Project Euler 10a: list primes below 2,000,000.
import pickle
def numprime(x):
for i in range(2, int(x**0.5)+1):
if x % i == 0:
return False
else:
return True
def growfile(primes, faccess):
file = open('primelist2kk.dat', faccess)
pickle.dump(primes, file)
file.close()
def main(fchunk, faccess):
#File input broken up for memory
for i in range(10):
plist = []
for j in range(1, fchunk, 2):
k = fchunk*i + j
if numprime(k):
plist.append(k)
if i == 0:
plist.pop(0)
plist.insert(0,2)
print()
print(plist)
growfile(plist, faccess)
def viewfile(faccess):
g = open('primelist2kk.dat', faccess)
h = pickle.load(g)
g.close()
print(h)
g.closed
#Supply 1/10 of the prime upper bound
#main(200, 'ab')
viewfile('rb')
我已经尝试了我能想到的文件访问代码的每个不同的合理组合,但没有任何作用。后续数据块可以删除第一个数据块,也可以根本不保存。有什么想法吗?
NB Unhash main()创建文件并显示程序输出。哈希main()和unhash viewfile()来查看文件。
答案 0 :(得分:2)
您需要使用追加模式(ab
)更新文件,但这还不够。 pickle.dump
写的每个二进制数据块都是独立的。当您为打开的文件执行pickle.load
时,您将只获得第一个。你需要做一个循环并继续加载数据,直到不再剩下。
def viewfile():
with open('primelist2kk.dat', 'rb') as g:
try:
while True: # run until there's an exception
h = pickle.load(g)
print(h)
except EOFError: # this will be raised by load() when there's no more data
pass
如果您不希望每个夹头单独打印,您可以将它们组合在一个列表中。
答案 1 :(得分:0)
您需要追加模式。即
faccess = 'ab'
除此之外:Sieve_of_Eratosthenes是生成这些素数的更快方法
筛子的例子
N = range(2000000)
P = []
for i in N:
if i > 1:
P.append(i)
N[::i] = [0]*((len(N)+i-1)//i)
print P