python文件操作的成本有多高?或;如何做更多的事情成本更低;
中的一位评论者表示,文件移动是一项昂贵的操作 我希望python使用LinuxMV命令,该命令速度非常快,因为它只涉及对文件系统目录的更改,所以我决定通过运行一些测试来研究这个问题。结果如下所示 第一个脚本创建文件10000次:python文件操作的成本有多高?或;如何做更多的事情成本更低;,python,linux,puzzle,Python,Linux,Puzzle,中的一位评论者表示,文件移动是一项昂贵的操作 我希望python使用LinuxMV命令,该命令速度非常快,因为它只涉及对文件系统目录的更改,所以我决定通过运行一些测试来研究这个问题。结果如下所示 第一个脚本创建文件10000次: print('-------------------------') print('Running write_only.py', end='') for i in range(0,10000): f = open('info.txt', 'w') f.
print('-------------------------')
print('Running write_only.py', end='')
for i in range(0,10000):
f = open('info.txt', 'w')
f.write(str(i))
f.close()
秒脚本还创建文件10000次,但除此之外,它还包括循环中的文件移动:
import os
import shutil
print('-------------------------')
print('Running write_and_move.py', end='')
for i in range(0,10000):
f = open('tmp', 'w')
f.write(str(i))
f.close()
shutil.move('tmp', 'info.txt') # This is the extra move operation
(有关这些脚本背后的原始概念,请参见上述帖子。)
此时,我运行了脚本,事情变得有趣起来:
什么?!!!添加的移动操作不仅没有增加执行时间,而且最后一次运行所花费的时间少于运行时间的1/2,运行“工作量更少” 好的-我会回答我自己的问题:) 我认为,当同名文件已经存在时,Python创建文件的时间要比重命名现有文件的时间长,这使得第一个脚本的速度变慢 此脚本测量在我的计算机上创建10000个唯一文件所需的时间: 警告!下面的脚本将在当前目录中创建10000.txt文件
print('-------------------------')
print('Running write_many.py', end='')
for i in range(0,10000):
f = open(f'str({i}).txt', 'w')
f.write(str(i))
f.close()
[cp@Lenny so]$ time python3 write_many.py
-------------------------
Running write_many.py
real 0m0.707s
user 0m0.293s
sys 0m0.414s
非常感谢@alaniwi不仅解决了这个难题,还感谢他对Python行为的出色分析。好的-我将回答我自己的问题:) 我认为,当同名文件已经存在时,Python创建文件的时间要比重命名现有文件的时间长,这使得第一个脚本的速度变慢 此脚本测量在我的计算机上创建10000个唯一文件所需的时间: 警告!下面的脚本将在当前目录中创建10000.txt文件
print('-------------------------')
print('Running write_many.py', end='')
for i in range(0,10000):
f = open(f'str({i}).txt', 'w')
f.write(str(i))
f.close()
[cp@Lenny so]$ time python3 write_many.py
-------------------------
Running write_many.py
real 0m0.707s
user 0m0.293s
sys 0m0.414s
非常感谢@alaniwi不仅解决了这个难题,还感谢他对Python行为的出色分析。由于垃圾收集的不可预测性,很难在Python下运行计时-即Python决定何时对内存而不是程序进行碎片整理。您的初始运行不包括“关闭”调用,这可能需要更多的工作来检查缓冲区状态等。@Mike I可以重现,写入和移动速度更快(尽管对我来说不如对OP来说快),然后在write_旁边添加一个显式的close只会对时间基本上没有影响。我想打开一个现有文件进行写入(截断)一定比打开一个新文件慢。编辑:是的,如果我对syscalls
strace-cT python filename.py进行计时,那么被覆盖的那一个肯定会在open
调用中花费更多的时间(事实上openat
)。@alanivi宾果!第二个脚本不必处理现有文件。@C.Pappy如果我使用低级I/O(os.open
,os.write
,os.close
,os.rename
),那么写入和移动肯定是两者中速度较慢的一个——C程序执行低级I/O也是如此。当存在一个文件时,python的高级文件I/O中的用户空间会发生这种情况。由于垃圾收集的不可预测性,很难在python下运行计时——即python决定何时运行整理内存碎片,而不是程序碎片。您的初始运行不包括“关闭”调用,这可能需要更多的工作来检查缓冲区状态等。@Mike I可以重现,写入和移动速度更快(尽管对我来说不如对OP来说快),然后在write_旁边添加一个显式的close只会对时间基本上没有影响。我想打开一个现有文件进行写入(截断)一定比打开一个新文件慢。编辑:是的,如果我对syscallsstrace-cT python filename.py进行计时,那么被覆盖的那一个肯定会在open
调用中花费更多的时间(事实上openat
)。@alanivi宾果!第二个脚本不必处理现有文件。@C.Pappy如果我使用低级I/O(os.open
,os.write
,os.close
,os.rename
),那么写入和移动肯定是两者中速度较慢的一个——C程序执行低级I/O也是如此。当存在一个现有文件时,python高级文件I/O中的用户空间就会发生这种情况。