gpt4 book ai didi

python - 是否可以使这个 shell 脚本更快?

转载 作者:太空狗 更新时间:2023-10-29 17:32:28 24 4
gpt4 key购买 nike

我的任务是创建一个脚本,该脚本将一个巨大的文本文件作为输入。然后它需要找到所有单词和出现次数,并创建一个新文件,每行显示一个唯一单词及其出现次数。

以一个包含以下内容的文件为例:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor 
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

我需要创建一个如下所示的文件:

1 AD
1 ADIPISICING
1 ALIQUA
...
1 ALIQUIP
1 DO
2 DOLOR
2 DOLORE
...

为此,我使用 trsortuniq 编写了一个脚本:

#!/bin/sh
INPUT=$1
OUTPUT=$2
if [ -a $INPUT ]
then
tr '[:space:][\-_?!.;\:]' '\n' < $INPUT |
tr -d '[:punct:][:special:][:digit:]' |
tr '[:lower:]' '[:upper:]' |
sort |
uniq -c > $OUTPUT
fi

它所做的是以空格作为分隔符来分割单词。如果单词包含 -_?!.;: 我再次将它们分解为单词。我删除了标点符号、特殊字符和数字,并将整个字符串转换为大写。完成此操作后,我对其进行排序并通过 uniq 将其传递为我想要的格式。

现在我下载了txt格式的圣经,并用它作为输入。我得到的时机是:

scripts|$ time ./text-to-word.sh text.txt b     
./text-to-word.sh text.txt b 16.17s user 0.09s system 102% cpu 15.934 total

我用 Python 脚本做了同样的事情:

import re
from collections import Counter
from itertools import chain
import sys

file = open(sys.argv[1])

c = Counter()

for line in file.readlines():
c.update([re.sub('[^a-zA-Z]', '', l).upper()
for l in chain(*[re.split('[-_?!.;:]', word)
for word in line.split()])])

file2 = open('output.txt', 'w')
for key in sorted(c):
file2.write(key + ' ' + str(c[key]) + '\n')

当我执行脚本时,我得到:

scripts|$ time python text-to-word.py text.txt
python text-to-word.py text.txt 7.23s user 0.04s system 97% cpu 7.456 total

如您所见,它的运行时间为 7.23s,而 shell 脚本的运行时间为 16.17s。我尝试过更大的文件,Python 似乎总是胜利。我有几个问题要问上面的senario:

  1. 既然 shell 命令是用 C 编写的,为什么 Python 脚本更快?我确实意识到 shell 脚本可能不是最佳脚本。
  2. 如何改进 shell 脚本?
  3. 我可以改进 Python 脚本吗?

需要说明的是,我并不是将 Python 与 shell 脚本进行比较。我不是想挑起一场口水战,也不需要用任何其他语言来比较自己更快的答案。使用通过管道传输小命令来完成任务的 UNIX 理念,如何使 shell 脚本更快?

最佳答案

这里很重要的一点可能是进程间 I/O。 Python 脚本将所有数据都存储在内存中,因此在处理数据时不会发生 I/O。

另请注意,Python 本身并不慢。 Python 中的大部分功能都是用 C 语言实现的。

shell 脚本必须启动 5 个进程,每个进程必须从 stdin 读取整个文本并将整个文本写入 stdout 四次。

可能有一种方法可以使 Python 脚本运行得更快一些:您可以将整个文本读入一个字符串,然后删除所有标点符号,拆分单词,然后计算它们:

text = file.read()
text = re.sub(r'[.,:;-_]', '', text)
text = text.upper()
words = re.split(r'\\s+', text)
c = Counter()
c.update(words)

这将避免多个嵌套循环的开销。

关于shell脚本:你应该尽量减少进程数。三个 tr 进程可能会被替换为对 sed 的一次调用。

关于python - 是否可以使这个 shell 脚本更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com