Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python文件操作的成本有多高?或;如何做更多的事情成本更低;_Python_Linux_Puzzle - Fatal编程技术网

python文件操作的成本有多高?或;如何做更多的事情成本更低;

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.

中的一位评论者表示,文件移动是一项昂贵的操作

我希望python使用LinuxMV命令,该命令速度非常快,因为它只涉及对文件系统目录的更改,所以我决定通过运行一些测试来研究这个问题。结果如下所示

第一个脚本创建文件10000次:

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只会对时间基本上没有影响。我想打开一个现有文件进行写入(截断)一定比打开一个新文件慢。编辑:是的,如果我对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中的用户空间就会发生这种情况。