Python每次都从文件中读取值还是将值存储在列表中?

2024-04-20 10:51:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在编写一个python脚本,用暴力生成每个素数。我目前有一个包含素数的大于5Mb的文件,当脚本运行时,它会附加找到的任何新素数,所以文件会不断变大。每次脚本运行时,这个文件都会被读入一个列表,然后循环计算下一个数字是素数还是非素数,任何新的素数也会附加到这个列表中。你知道吗

我的问题是,是每次运行脚本时都将这个文件加载到内存中更好,还是应该在for循环中读取文件的下一行,对照检查的数字处理该行,然后加载下一行?你知道吗

前一个循环会产生一个很大的内存,但我不认为它在每一秒都会被读取。你知道吗

这是我的代码,它将一个配置文件作为一个参数,其中包含开始查找素数的编号和读取/写入素数的文件:

import sys, math, time

def is_prime(num,primes):
    square = math.floor(math.sqrt(num))
    print('using all prime numbers up to %d' % square)
    for p in primes:
        if p <= square:
            print (p, end='\r')
            if (num % p) == 0:
                return False
        else:
            return True
    return True

def main(argv):
    if len(sys.argv) == 2:
        try:
            try:
                f = open(sys.argv[1], 'r+')
            except IOError:
                sys.exit('Error: File %s does not exist in the current directory...\nUsage: generate_primes.py <prime_file>' % sys.argv[1])
            f.close()

            f = open(sys.argv[1], 'r+')
            low = f.readlines()
            f.close()

            num_to_check = int(low[0].strip('\n'))
            file_name = low[1].strip('\n')
            print(num_to_check)
            print(file_name)

            if num_to_check % 2 == 0:
                num_to_check += 1

            f = open(file_name, 'a+')
            f.seek(0)
            primes = f.readlines()

            print('Processing Primes...')
            for key,i in enumerate(primes):
                primes[key] = int(primes[key].strip('\n'))

            if primes[-1] > num_to_check:
                num_to_check = primes[-1]
                print('Last saved prime is bigger than config value.\nDefaulting to largest saved prime... %d' % primes[-1])

            time.sleep(2)

            new_primes = 0

            while True:
                print('Checking: %s ' % str(num_to_check), end='')
                if is_prime(num_to_check,primes):
                    print('Prime')
                    f.write('%s\n' % str(num_to_check))
                    primes.append(num_to_check)
                    new_primes += 1
                else:
                    print('Composite')
                num_to_check += 2

        except KeyboardInterrupt:
            config_name = time.strftime('%Y%m%d-%H%M%S')
            print('Keyboard Interrupt: \n creating config file %s ... ' % config_name)
            c = open(config_name,'w')
            c.write('%d\n%s' % (num_to_check,file_name))
            c.close()
            f.close()
            print('Done\nPrimes Found: %d\nExiting...' % new_primes)
            sys.exit()


if __name__ == '__main__':
    main(sys.argv[1:])

注意:primes文件不能包含一个单独的1,否则每个数字都会出现复合值。你知道吗

我只关心从文件中读取的一个问题是能够获得存储的最大素数(aka)的值。读取文件中的最后一行)。你知道吗


Tags: 文件toname脚本configifchecksys
1条回答
网友
1楼 · 发布于 2024-04-20 10:51:33

对速度和内存的优化常常会有分歧。有些程序会占用大量内存,但速度很快(Chrome努力做到这一点),有些程序可能会反过来,许多程序试图在两者之间寻求平衡。选择重点应该主要围绕问题、用例和数据(如果你真的很彻底的话)。你知道吗

如果脚本要反复运行,那么延迟和慢速度加起来真的很快。。。您可能需要集中精力优化速度。如果脚本运行时间超过一秒左右,并且用户必须毫无用处地盯着屏幕,直到完成后才能继续。。。你可能需要关注速度。如果你的行动是时间敏感的,也许事情需要实时发生,你不想落后于过多的延迟。。。你可能需要关注速度。你知道吗

如果脚本只是偶尔运行,并且主要是在时间不敏感的环境中运行,最好是在后台某处,尤其是在有限或较低端的硬件上运行。。。你可能想专注于记忆。你知道吗

更具体地说你的问题,我可以说我完全同意克里斯特扬的评论,5MB不是那么多。现在看看我笔记本电脑上的任务管理器,我可以说我打开了两个wikipedia的标签,很久没碰过了,他们使用的是33x,Facebook上的一个标签,类似的故事,但是280x,rubyMine(IDE)使用的是244x,activity monitor(任务管理器)本身使用的是33x,在20MB下发生的事情并不多除了一些小的系统的东西,这些东西真的应该组合在一起,以减少混乱,还有一些程序,我以为我一周前就关闭了。如果应用程序的其余部分保持相对较低的内存占用,那么您的目标不是薄弱的或嵌入式硬件,人们很可能会更快地抱怨速度慢,而不是内存中的~5MB占用,特别是如果您在完成后将其清理干净(更适用于较低级别的语言,但也许del在这里可以有所帮助)。你知道吗

实际上,只有你知道你所处理的问题的局限性。嗯,那可能不是真的,但我确实不认识他们。您将不得不打电话说明在实现中什么对您来说是重要的,这可能涉及到某个地方的妥协。对两个实现进行基准测试以量化速度的提高可能会帮助您证明一个决策优于另一个决策,而且在某种程度上,也可以考虑实现的易用性。你知道吗

相关问题 更多 >