文件I/O的意外计时结果

在阅读了有关打开和关闭很多文件的较早线程之后,
我以为我会做一些实验.
假设您有很多文件,并且需要打开每个文件,
附加字符串,然后关闭它们.有两种明显的方法:
通过文件对您的代码进行分组,或通过过程对代码进行分组.
#方法一:通过文件分组.
对于每个文件:
打开文件,附加字符串,然后将其关闭
#方法2:按过程分组.
对于每个文件:
打开文件
对于每个打开文件:
附加字符串
对于每个打开文件:
关闭文件
如果您有n个文件,则两种方法都会进行相同的I/O调用数量:n
打开,n写道,n关闭.哪个更快?
直觉上,第一种方法 *的速度更快,对吗?有一个
循环而不是三个,它不会建立开放的中间列表
文件对象.如此 *显然 *会更快,几乎没有
值得与TimeIt进行检查,对吗?
好吧,除非那个直观的结果是错误的,否则我不会写作.所以
这是我的测试结果:
方法1:
.... fp = open(名称,'a'); fp.write('xyz \\ n'); fp.close()
....
17.391216039657593
方法2:
.... fp = open(名称,'w'); fp.close()
...
....对于文件中的fp:
.... fp.Write('xyz \\ n')
....对于文件中的fp:
.... fp.close()
....''','''来自__ -main __导入名称'')
16.823362112045288
令人惊讶的是,方法2更快地是一个smidgen,大约一秒钟
500,000个开放式固定周期.它的速度并不快,但是
一致,在许多测试中,都会更改许多参数(例如
文件数量,每次计时测试的运行次数等).
我正在使用Linux和Python 2.5.
发生什么了?谁能解释为什么要做更多工作的代码
花费更少的时间?
- -
史蒂文

# 回答1


史蒂文·达·阿普拉诺(Steven D'Aprano)写道:
简短的答案:CPU和RAM比硬盘快得多.
这三个循环和列表的创建仅花费几个CPU周期
与将新数据冲洗到磁盘相比.
克里斯蒂安
# 回答2


在2008年2月4日星期一15:17:18 +0000上
无法确认此(Linux,Python 2.5):
方法1:15.380897998809814
方法2:18.085366010665894
我想这确实是关于磁盘IO的全部
显示几乎所有时间都花在内核上,很少
在用户空间中.
再见,
marc'blackjack'rintsch
# 回答3


2月4日,上午10:17,Steven d'Aprano cybersource.com.auwrote:
... fp = open(名称,'a'); fp.write('xyz \\ n'); fp.close()
...'',',''''___main __导入名称')>> min(t.repeat(6,500))
17.391216039657593
方法2:
... fp = open(名称,'w'); fp.close()
... >> t = timeit.timer(''''files = [open(name,'a')in name中的名称]
...对于文件中的fp:
... fp.write('xyz \\ n')
...对于文件中的fp:
... fp.close()
...''''''来自__ -main __导入名称''')>> min(t.repeat(6,500))
16.823362112045288
令人惊讶的是,方法2更快地是一个smidgen t半秒钟
500,000个开放式固定周期.它的速度并不快,但是
一致,在许多测试中,都会更改许多参数(例如
文件数量,每次计时测试的运行次数等).
我正在使用Linux和Python 2.5.
发生什么了?谁能解释为什么要做更多工作的代码
花费更少的时间?
- -
史蒂文

做更多工作的代码需要更多的时间.第二个确实
工作少一些.这样想:
您有500,000人可以通过一扇门适合.这是您的选择:
1.对于每个人,打开门,穿过门,然后关闭
门.
2.打开门,让每个人都走过,然后关闭
门.
您会说哪一个是一种更有效的方法来适合500,000
人们穿过门?

# 回答4


EN MON,2008年2月4日15:53:11 -0200,rdahlstrom
escribi�:
嗯,不,第二个应该是:
2.创建500,000个门并打开它们.
让每个人一次进入房间 - 一次使用自己的门.
关闭500,000个门中的每一个.
- -
Gabriel Genellina
# 回答5


2008年2月4日,星期一17:08:02 +0000,马克·二十一点'rintsch写道:
无法确认此(Linux,Python 2.5):
方法1:15.380897998809814
方法2:18.085366010665894
嗯...您的系统是否使用软件突袭?我的.我想知道那是
相关因素?
如果这与操作系统缓存有关,我不会感到惊讶
写信给磁盘.说那真的只是我做了很多手 -
挥舞着说:"这是我们所知道的魔力".
- -
史蒂文

标签: python

添加新评论