You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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                 

问题根源:不是内存管理,是逻辑与缓冲区问题

你遇到的问题和内存管理完全无关,核心是两个点:

  1. 素数判断逻辑的低效与写入时机:原代码只有当num是素数时才会触发写入,但判断素数的逻辑写在for循环内部,且依赖i == primes[-1]的判断——当primes在循环中被修改时,这个判断很容易失效,导致写入代码执行的频率极低。
  2. 文件缓冲区未及时刷新: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:42:48