Python计算速度太慢,如何解决我这个简单的计算问题?求指导。。。

xhp168168 2017-12-16 04:48:05

想实现以下算法:前三列一共有30个数,记下每个数值出现的次数,每个数值出现的次数与前面的次数做累加,算出百分比,即最后一列。

我用python的for循环已经实现,但数据量大了(几十万个数)之后,速度很慢,不知道用numpy或者pandas能否提高计算速度,具体如何实现? 求指导。。。









...全文
2215 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyxlyx1993 2020-05-12
  • 打赏
  • 举报
回复
用numba加字典,1亿数据10s内可以跑完

from numba import jit, types
from numba.typed import Dict
import time
import numpy as np

def attain_percentile(myarray):
@jit(nopython=True)
def count_value(myarray):
value_count = Dict.empty(key_type=types.int32, value_type=types.int32, )
for x in myarray:
if x in value_count:
value_count[x] += 1
else:
value_count[x] = 1
return value_count
value_count = count_value(myarray)
key_type = np.sort(np.array([key for key in value_count]))
percentile = np.cumsum(np.array([value_count[key] for key in key_type]))
percentile = percentile / (len(myarray) + 1)
return percentile

myarray = np.random.randint(0, 10**4, 10**8)

t1 = time.time()
percentile = attain_percentile(myarray)
t2 = time.time()
print(t2 - t1)
龙鹰心腹 2018-10-06
  • 打赏
  • 举报
回复
很明显是在出现的数值和出现次数那里花太多时间了,你每个数值都要重新搜索一次全部数据,怎么不花时间?用字典来统计,只要出现的数值就+1,遍历一次数据就完成统计了
AlbertS 2017-12-22
  • 打赏
  • 举报
回复
到底有多慢,想看看计算有多复杂
extend 2017-12-19
  • 打赏
  • 举报
回复
引用 8 楼 extend 的回复:
你的问题还是有点笼统,运行半小时,知道大部分时间都用哪了吗? 一个思路,multiprocessing吧,数据切片,多进程处理,提升应该较明显。
补充下,你这个明显是计算密集型,多进程应该能解决。
extend 2017-12-19
  • 打赏
  • 举报
回复
你的问题还是有点笼统,运行半小时,知道大部分时间都用哪了吗? 一个思路,multiprocessing吧,数据切片,多进程处理,提升应该较明显。
xhp168168 2017-12-18
  • 打赏
  • 举报
回复
楼主回复: 除以30和除以(30+1)差别不大,只是算法规定而已。每次运算我都会记下本次累加的结果,下次就只做一次加法,代码就是这样实现的。 真实数据有几十万行,每行有上百列,所以总体的数据量就大了,运行时间需要半个小时以上,我期望在十分钟以内算完。上面的数据是实际计算的一个抽象,方便大家理解,实际运行比上面的复杂很多。关键地方用C写也想到了,但不想为这点东西重新搭C的开发环境,而且好多年不用C,都忘了,呵呵。。。 提出这个问题,是想看看大家遇到类似的问题有没有好的解决办法,供论坛里的小伙伴一起学习和提高。。。
extend 2017-12-18
  • 打赏
  • 举报
回复
用pandas也解决不了统计重复次数慢的问题啊。
extend 2017-12-18
  • 打赏
  • 举报
回复
另外确定了哪个环节慢?是算重复次数慢还是怎样?
extend 2017-12-18
  • 打赏
  • 举报
回复
慢到什么程度?
ckc 2017-12-17
  • 打赏
  • 举报
回复
为什么是除以(30+1)? 几十万个数据最后一个是累加了几十万个数据之后再得出结果的吗? 如果每一次利用了上一次的结果其实每一行都只需要做一次加法再做一次除法, 应该很快的
混沌鳄鱼 2017-12-17
  • 打赏
  • 举报
回复
按理说几十万的数据量很小啊,而且你这个是个很简单的运算,怎么会有很长慢的问题出现呢。 因为不太清楚你这个问题的具体需求和限定条件。 你要不怕献丑最好把代码贴上来,大家帮你看看哪里有问题。 python解决性能问题的办法非常多,这种密集运算的用Pypy来运行直接就能快4-5倍。 或者关键地方用C改写,都可以。
Gods_Dusk 2017-12-16
  • 打赏
  • 举报
回复
你这种运算比较难于转化为矩阵运算,而numpy对元素操作的话比list还慢 你可以试试cython和pypy

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧