由于某种原因,我无法弄清楚这只会在pi.txt文件中写入11571个字符 - 远远超过5万个应该是我一直在查找与磁盘IO有关的缓冲区,并尝试过os.fsync(fo)每10万次迭代,但同样的事情发生,实际上只有11571个字符记录在txt文件中 它似乎产生了所有5万个字符(计数状态最多可达50k) 这是我的代码,磁盘缓冲区或简单的问题,我完全失踪了。 这段代码来自这里:1000 digits of pi in python
我尝试过这个解决方案:Python not writing full string to file
完全相同的事情,记下文件的大小
我也尝试计算更长和更短的值,同样的问题。
import os
fo=open("pi.txt", "wb")
def make_pi():
cnt = 1
q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
for j in range(50000):
if 4 * q + r - t < m * t:
fo.write(str(m))
yield m
q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
else:
q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2
if cnt % 1000 == 0:
print("Count status: %s" % cnt)
elif cnt % 10002 == 0:
fo.flush()
os.fsync(fo)
else:
pass
cnt+=1
for i in make_pi():
pass
fo.close()
另外,如果它有所作为我使用Windows 7 64位,我还没有在linux中尝试过这个。
这是固定代码,正常工作:)
fo=open("pi.txt", "wb")
def make_pi():
cnt=0
q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
while True:
if 4 * q + r - t < m * t:
if cnt % 1000 == 0:
print("Counted %s places" % cnt)
else:
pass
yield m
fo.write(str(m))
cnt+=1
q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
else:
q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2
i = 0;
for x in make_pi():
i += 1
if i == 10001:
break
fo.close()
感谢您指出:)
答案 0 :(得分:3)
这是一个逻辑问题,而不是缓冲/光盘同步问题。如果条件:4 * q + r - t < m * t
为TRUE,则该函数仅产生(并写入),在50K循环中仅为11571次。
只是因为......这里有一个稍微修改过的版本应该可以实现你想要做的事情:生成PI的前X位数:
fo=open("pi.txt", "wb")
def make_pi(num_digits):
q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
j = 0
while True:
if 4 * q + r - t < m * t:
fo.write(str(m))
yield m
q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
j += 1
if j % 1000 == 0:
print("Count status: %s" % j)
else:
q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2
if j >= num_digits:
break
for i in make_pi(50000):
pass
fo.close()