在这种情况下,为什么 awk 比 python 快得多?

Zak*_*akS 1 python awk

我有一个包含 200,000 行的剪辑列表,每行的形式为

<field 1> <field2>
Run Code Online (Sandbox Code Playgroud)

为了只获取字段 1,我可以运行如下所示的脚本

import os
import sys
jump = open(sys.argv[1],"r")
clips = open("clips.list","w")
text = jump.readlines()
list_of_clips = str()

for line in text: 
     clip_to_add =   line.split(" ")[0]
     list_of_clips = list_of_clips + clip_to_add +'\n' 

with open ('clips.list', 'w') as file:
file.write (list_of_clips)

jump.close()
Run Code Online (Sandbox Code Playgroud)

或者我可以使用awk 'print{($1)}'

为什么 awk 这么快?它在大约 1 秒内完成工作。

Daw*_*weo 7

import os
import sys
jump = open(sys.argv[1],"r")
clips = open("clips.list","w")
text = jump.readlines()
list_of_clips = str()

for line in text: 
     clip_to_add =   line.split(" ")[0]
     list_of_clips = list_of_clips + clip_to_add +'\n' 

with open ('clips.list', 'w') as file:
file.write (list_of_clips)

jump.close()
Run Code Online (Sandbox Code Playgroud)

从性能的角度来看,这段代码写得很差。.readlines()需要读取整个文件来创建列表(这是可变的,您根本不使用的功能),即使在您的情况下您不必知道整个文件的内容即可完成处理。当您读取文件时,您可能会使用它for line in <filehandle>:来避免将整行读取到内存中,使用这个您可能会像这样使用print空格分隔的第一个字段file.txt

with open("file.txt","r") as f:
    for line in f:
        print(line.split(" ")[0])
Run Code Online (Sandbox Code Playgroud)

此外,您import os使用了其中包含的任何功能,然后又不使用其中包含的任何功能,并且还打开了clips.list两次,一次是clips稍后的file,然后从不使用前者的任何功能。

简而言之:AWK 代码编写正确,而提供的awk '{print $1}'代码质量python非常可疑,比较它们会给出不可靠的结果。