Python中不调用print()时无限列表存JSON文件的内存管理问题
无限素数生成写入JSON时的空文件问题
我用Python生成一个无限素数列表,尝试把列表写入prime.json文件时,文件总是空的。但只要保留print(primes)这行代码,JSON文件就能正常写入数据。我怀疑这和内存管理有关,但搞不懂具体原因。
代码如下:
import json num = 5 primes = [2, 3] while True: for i in primes: if num % i ==0: break if i == primes[-1]: primes.append(num) #if i delete below print(primes) then why prime.json beomes empty print(primes) filename = 'prime.json' with open(filename, 'w') as f: json.dump(primes, f) num = num + 2
问题根源:不是内存管理,是逻辑与缓冲区问题
你遇到的问题和内存管理完全无关,核心是两个点:
- 素数判断逻辑的低效与写入时机:原代码只有当
num是素数时才会触发写入,但判断素数的逻辑写在for循环内部,且依赖i == primes[-1]的判断——当primes在循环中被修改时,这个判断很容易失效,导致写入代码执行的频率极低。 - 文件缓冲区未及时刷新:Python的文件操作默认带缓冲,
json.dump执行后数据可能还留在内存缓冲区里,没真正写入磁盘。如果程序之后一直卡在无限循环(比如持续判断非素数,没再触发写入),操作系统不会主动刷新缓冲区,文件就会显示为空。
而print语句的作用是:它会强制刷新标准输出缓冲区,间接触发了系统的I/O调度,让文件缓冲区的内容也被写入磁盘;同时print会拖慢程序速度,给了缓冲区足够的时间完成写入,让你误以为是内存问题。
修复方案
方案1:优化素数判断逻辑+手动刷新缓冲区
先重构素数判断逻辑,让代码更清晰,再手动强制刷新文件缓冲区,确保数据写入磁盘:
import json import os num = 5 primes = [2, 3] while True: is_prime = True # 优化:只需要判断到num的平方根,大幅提升效率 for i in primes: if num % i == 0: is_prime = False break if i * i > num: break if is_prime: primes.append(num) with open('prime.json', 'w') as f: json.dump(primes, f) f.flush() # 把缓冲区数据刷到内核 os.fsync(f.fileno()) # 强制内核把数据写入磁盘 num += 2
方案2:减少重复覆盖写入(可选)
如果只是需要记录素数,没必要每次都覆盖整个文件,可以先写入初始素数,之后只追加更新:
import json num = 5 primes = [2, 3] # 先写入初始素数 with open('prime.json', 'w') as f: json.dump(primes, f) while True: is_prime = True for i in primes: if num % i == 0: is_prime = False break if i * i > num: break if is_prime: primes.append(num) with open('prime.json', 'w') as f: json.dump(primes, f) num += 2
关键结论
- 空文件是文件缓冲区未及时刷新+原代码逻辑导致写入后程序长期阻塞共同造成的,和内存管理无关。
print只是间接触发了缓冲区刷新,并非解决了内存问题。
内容的提问来源于stack exchange,提问作者sartaj ansari
相关产品推荐
相关产品推荐

