Performance Python 2.7中write()的性能?

Performance Python 2.7中write()的性能?,performance,file-io,python-2.7,windows-7,Performance,File Io,Python 2.7,Windows 7,我发现write()在使用Python 2.7.3的Windows 7上的性能特别慢。这与使用Archlinux在我的笔记本电脑上运行的相同代码相比,Archlinux的执行速度至少要快10-30倍。我是否做错了什么,是否有一些参数我可以调整以尝试和帮助事情?我应该使用writelins()而不是write() 具体情况如下: 对于文件的每一行,将一行写入其他两个文件。我基本上是在重新格式化文件 所讨论的文件大小约为350MB,大约包含200.000行。在我运行Archlinux的笔记本电脑上,

我发现write()在使用Python 2.7.3的Windows 7上的性能特别慢。这与使用Archlinux在我的笔记本电脑上运行的相同代码相比,Archlinux的执行速度至少要快10-30倍。我是否做错了什么,是否有一些参数我可以调整以尝试和帮助事情?我应该使用writelins()而不是write()

具体情况如下:

对于文件的每一行,将一行写入其他两个文件。我基本上是在重新格式化文件

所讨论的文件大小约为350MB,大约包含200.000行。在我运行Archlinux的笔记本电脑上,这个过程大约在1-2分钟内完成。在Windows上,22分钟的内存只写了165MB。如果这是一次性的,这不会是一个问题,但由于我将把它交给其他人运行,我想弄清楚我是否能以某种方式改进它。其中有五个文件,这意味着需要几个小时的处理

相关代码:

    with open('%s/%s.dat' % (cacheDir, f_from), 'r') as old_file:
         with open('%s/%s.dat' % (vectorsDir, f_to), 'w+') as dat_file:
             with open('%s/%s.idx' % (vectorsDir, f_to), 'w+') as idx_file:
                dat_text = ''
                idx_text = ''
                for line in old_file:
                    data = line.split()
                    cats = self.ids[data[0]]
                    dat_line = '%s %s\n' % (string.join(cats,','), string.join(data[1:]))
                    idx_line = '%s\n' % data[0]
                    dat_text += dat_line
                    idx_text += idx_line
                    dat_file.write(dat_line)        
                    idx_file.write(idx_line)
                return dat_text, idx_text
(重新发布评论作为回答。)


Windows计算机上的内存使用情况如何?您正在内存中建立一些大字符串;也许这导致了交换。如果不在
dat_text
idx_text
中积累数据,速度会更快吗

(1)您对操作系统是相关因素的信心有多大?这两台机器的硬盘驱动器可比吗?(2) 您是否尝试过在打开
dat_文件
idx_文件
时指定一个大的写入缓冲区?(1)公平地说,我没有。硬盘驱动器都是通过S.M.A.R.T.的7200RPM SATA2硬盘驱动器,而笔记本电脑驱动器实际上要旧得多。(2) 我尝试了20MB、50MB和100MB的缓冲区。这似乎对速度几乎没有影响。直到明天,我才有机会在另一台Windows机器上测试这一点,但当我测试时,我会报告我是否看到相同的行为。其他一些(纯粹是推测性的)想法:(a)Windows机器上的内存使用情况如何?你正在建立一些大的字符串;也许你开始交换了。如果您不在
dat_text
idx_text
中积累数据,是否会更快?(b)您正在交替访问三个不同的文件。在Windows计算机上,磁盘上文件的布局可能是不幸的,这种访问模式的旋转延迟正在伤害您。如果您有足够的内存,请尝试一次全部读取
旧的\u文件
,然后执行一次迭代,在其中写入
dat\u文件
,在另一次迭代中写入
idx\u文件
。这会改变总体时间吗?(顺便说一句,虽然我不熟悉Windows如何执行IO缓冲,但我猜20MB太大了,而您所做的只是为内核做更多的工作。我正在考虑一些类似4k或16k的东西。)