【发布时间】:2013-11-28 09:50:07
【问题描述】:
由于某种原因,我无法弄清楚这只会在 pi.txt 文件中写入 11571 个字符 - 远低于 50,000 个字符,我应该一直在查找与磁盘 IO 相关的缓冲区,并尝试过os.fsync(fo) 每1万次迭代,但是同样的事情发生了,txt文件中实际只记录了11571个字符 它似乎正在生成所有 50,000 个字符(计数状态最多为 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()
感谢您指出这一点:)
【问题讨论】:
-
if 4 * q + r - t < m * t:声明总是正确的吗?
标签: python