弱极了,请教 Python 多线程如何快速开始

2023-06-02 01:39:15 +08:00
 pathetique
文科轻拍

晚上用 python 写雍正实录的词汇统计

雍正的起居官特别能写,一百三十多万字,用 M1 pro 的电脑,半个小时才检索到三万多字(算法应该没问题),看了看 cpu ,只有一个 100%的占用

有没有特别简单的 python 多线程调用入门,希望自己能理解的那种?

不知道问清楚没有
4325 次点击
所在节点    Python
53 条回复
pathetique
2023-06-02 20:37:10 +08:00
@zhzy
@ispinfx
非常感谢
pathetique
2023-06-02 20:37:52 +08:00
再问一个白痴问题,我和您方案的最大差别是不是创建的对象是不是 hashable 的差别?大概就是 30 楼大哥说 list 的效率低,hash 效率高的问题?
非常非常感谢两位的时间!知道大家都挺忙……
pathetique
2023-06-02 20:38:31 +08:00
奇怪为啥有些帖子回复发不出去说要注册 1001 天……1001nights 吗……
zhzy
2023-06-02 20:39:04 +08:00
@pathetique #40 pathlib 是一个文件系统路径库,封装了一些比较方便的功能,比如可以直接读取文本,用来代替 with...as f: f.read ;
counter 是一个字典,对于一个字典对象 d ,d.items 是取出每一项的键(key)和值(value)
for k, v in d.items()这个循环相当于逐一取出字典的每一项
counter.get(key, defaultValue)实际上可以理解为 if key in counter.keys: counter[key]; else: return defaultValue, 作用是尝试根据键读取字典的一个值,如果不存在这样的键, 返回 defaultValue
在 python 里其实这类方法很多, 可以节省很多代码量, 并且速度要比你自己写的逻辑快, 因为在底层它可能会做一些优化
zhzy
2023-06-02 20:40:56 +08:00
@ispinfx #39 啊 我明白您的意思了, 其实我的意思是 collections.Counter 是可以直接传一个可迭代对象或者 map 的, 比如传一个 str 或 list 进去就可以直接做计算
aitianci
2023-06-02 20:55:38 +08:00
@Kinnice #23 我玩了一下,用 jieba 出来的效果还不如 re 。我是从网上下载的一个 2MB 多的雍正实录,到 115 卷就没了。jieba 给出的全是单字词,像“朕,等,为,有”这种,re 能给“出谕内阁,应如所请,寻议,下部知之,入祠致祭如例,均应如所请,缘事革职,谕大学士等,给银建坊”这种还有点含义的词组。
LaurelHarmon
2023-06-02 20:57:43 +08:00
笑死,这点数据量,跟多线程、多进程没半毛钱关系,你还是先理清楚需求,然后改一下代码。正常情况秒秒钟出来,暴力循环不可取。
pathetique
2023-06-02 21:12:16 +08:00
@aitianci 嗯嗯,其实最大的价值、不是在于观察已有的成形的 pattern 或者单词,而恰恰是一些直观不熟悉但统计上又显著的词汇、语法结构或者说法。比如很多语言中动词-主语-宾语顺序多,但某些地方开始突然高密度调用其他语序;或者很多语言的果-因表达多,但如果突然用因-果连词;或者突然用佶屈聱牙的、甚至字典上没有的词,就很可能有很重要的、非母语者不容易看出的情绪或者信息。反常的信息最珍贵
pathetique
2023-06-02 21:12:43 +08:00
@zhzy 非常感谢,我去读下 pathlib 的文档~
Deplay
2023-06-03 00:24:05 +08:00
单从实现这个任务来讲,使用现成的 wheel 更好的选择,自己写还是很难的,例如#23 所提及的 jieba
也可以考虑上 nlp ,nltk 应该就可以(这一块没怎么接触过,不是很清楚)
至于你提到用 gpu 处理,理论上确实可以,但没必要,毕竟不是很复杂的任务,dl 没必要,学习成本过高
julyclyde
2023-06-03 12:03:59 +08:00
@Anarchy 分章节、分段落是人工还是自动呢?如果是自动,那也得按顺序过一遍程序啊,这环节也是不能并发的吧
phoulx
2023-06-03 17:52:42 +08:00
#48 感觉 up 做的东西很有意思呢,之前专业相关,Python 也懂一点。看上去主楼问题已经解决了?如果仍有疑问,欢迎联系 https://paste.rs/Zb0gs ,也许可以提供一点帮助!
klion
2023-06-03 23:21:44 +08:00
就算文字有 1000 万,也不过不到 100M 的内存,这怎么会 3 万字跑半个小时啊,是不是你自己用了太多 for 做遍历了,看起来更像是你的代码需要优化,你去用 profile 逐行分析代码性能瓶颈再讨论吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/945072

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX