关于 python 除法效率问题

2016-04-22 03:06:58 +08:00
 SlipStupig

做一个除法计算发现速度出奇的慢有什么办法提高呢?

以下是我代码的一个 demo


import string
import random
from math import log

wordlist = [i for i in xrange(100000)]

def calc(words):
    log(wordlist.count(words)/len(wordlist)) +1) * (wordlist)

map(clac, wordlist)

4614 次点击
所在节点    Python
25 条回复
Allianzcortex
2016-04-22 19:15:23 +08:00
计算密集型开多线程的作用不大呀。用 numpy
billlee
2016-04-22 20:53:13 +08:00
@SlipStupig 这个就是 C 和 python 的问题,楼主这个算法用矩阵算和手写是一样的, numpy 快就是因为它内部的循环是用 C/Fortran 实现。
ShiHou
2016-04-23 02:57:09 +08:00
@SlipStupig 233 你说得对. 我本来是想表达多进程的,结果糊涂达成多线程了。 Python 有 GIL 锁导致计算密集时多进程没用。

@SlipStupig 用 Numpy 把所有的词频做成矩阵,对矩阵一次性求 log 比循环过去 log 快很多。 矩阵快的原因有两个,一是底层用 c 写,循环比脚本语言快。二是矩阵的内置操作基本都做了优化,比如 N^2.73 复杂度的矩阵乘。
ShiHou
2016-04-23 02:57:51 +08:00
@ShiHou s/多进程没用 /多线程没用... 这两个词太像了 我下次还是说 process 和 thread 吧
SlipStupig
2016-04-23 11:24:42 +08:00
@ShiHou GIL 是全局解释锁,会导致多线程没用,进程之间是没有隔离的

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

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

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

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

© 2021 V2EX