gpt4 book ai didi

Python - 多线程字/行计数

转载 作者:行者123 更新时间:2023-11-28 22:02:43 25 4
gpt4 key购买 nike

我正在尝试了解 python 中的多线程处理。我有工作代码来计算单词数、文本行数,并创建一个包含每个单词数的字典。它在代码注释中提到的小文件上运行速度很快。但是我通常使用 glob 来提取多个文件。当我这样做时,运行时间会显着增加。同时,由于我的脚本是单线程的,我看到我有 3 个其他核心处于闲置状态,而其中一个已达到极限。

我想我会试一试 python 多线程模块,这是我目前所做的(非工作):

#!/bin/python
#
# test file: http://www.gutenberg.org/ebooks/2852.txt.utf-8

import fileinput
from collections import defaultdict
import threading
import time

inputfilename = 'pg2852.txt'

exitFlag = 0

line = []
line_counter = 0
tot_words = 0
word_dict = defaultdict(int)

def myCounters( threadName, delay):
for line in fileinput.input([inputfilename]):
line = line.strip();
if not line: continue
words = line.split()
tot_words += len(words)
line_counter += 1
for word in words:
word_dict[word] += 1

print "%s: %s:" %( threadName, time.ctime(time.time()) )
print word_dict
print "Total Words: ", tot_words
print "Total Lines: ", line_counter

try:
thread.start_new_thread( myCounters, ("Thread-1", 2, ) )
thread.start_new_thread( myCounters, ("Thread-2", 4, ) )
except:
print "Error: Thread Not Started"

while 1:
pass

对于尝试此代码的人来说,它不起作用。我假设我需要将输入文件分成 block 并以某种方式合并输出。 ? map /减少?也许有更简单的解决方案?

编辑:

也许是这样的:

  1. 打开文件,
  2. 把它分成小块
  3. 将每个 block 提供给不同的线程
  4. 获取计数并在每个 block 上构建字典
  5. 合并计数/字典
  6. 返回结果

最佳答案

首先,您说得对,您需要使用并行进程而不是并行线程。由于全局解释器锁 (GIL),执行此类任务 [请参阅下面的 ETA] 无法很好地扩展到 python 下的多线程。

如果您想并行处理单个文件,显而易见的方法是首先检查文件大小,然后将大小相等的 block 分配给多个进程。这只涉及告诉每个进程从文件中的什么位置开始,以及从什么位置结束。 (当然,您必须注意不要对任何单词或行计数两次。一个简单的方法是让每个进程忽略初始字节,直到它到达一行的开头,然后开始计数)。

但是,您在问题中声明您将使用 glob 来处理多个文件。因此,与其采用复杂的文件分块并将 block 分配给不同的进程,更简单的选择是简单地将不同的文件分配给不同的进程。


预计到达时间:

在 Python 中使用线程适合某些用例,例如使用长时间阻塞的 I/O 函数。 @uselpa 是正确的,如果处理是 I/O 绑定(bind),那么线程可能会执行良好,但这里不是这种情况,因为瓶颈实际上是解析,而不是文件 I/O。这是由于 Python 作为一种解释型语言的性能特点;在编译语言中,I/O 更有可能成为瓶颈。

我做出这些声明是因为我刚刚根据原始代码做了一些测量(使用包含 pg2852.txt 的 100 个串联副本的测试文件):

  • 作为单线程运行大约需要 2.6 秒来读取和解析文件,但当我注释掉解析代码时只需要 0.2 秒。
  • 并行运行两个线程(从同一个文件读取)需要 7.2 秒,但并行启动的两个单线程进程只需要 3.3 秒即可完成两者

关于Python - 多线程字/行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10868710/

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