【Python性能优化实例】计算 numpy 数组首尾为 0 的数量
admin
2024-04-08 19:52:15
0
import numpy as np
import timeit
测试数据

开头有 30000 个 0 元素,中间有 100000 个非 0 元素,结尾有 70000 个为 0 元素的 numpy 数组。下面以计算数组末尾的零的数量为例。

array = np.array([0] * 30000 + [i for i in range(1, 1000001)] + [0] * 70000)
方法 1

使用 Python 的循环,从后向前遍历 numpy 数组并统计为 0 元素的个数,当遇到非 0 元素时,则跳出循环。

res1 = 0
for i in range(array.shape[0] - 1, -1, -1):if array[i] == 0:res1 += 1else:break
方法 2

先使用 numpy 的切片器倒序数组,然后使用 numpy 的 consum 的函数计算前缀和;此时除原数组末尾的 0 元素外的其他元素均已变为非 0 元素。于是,先使用 numpy 的 count_nonzero 方法统计满足元素值等于 0 的元素数量。

numpy 的 参考文档:https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html

res2 = np.count_nonzero(np.cumsum(array[::-1]) == 0)
方法 3

在方法 2 的基础上,先直接统计非 0 元素数量,再使用元素总数减去非 0 元素数量得到 0 元素数量。

res3 = array.shape[0] - np.count_nonzero(np.cumsum(array[::-1]))
结果检查
assert res1 == res2 == res3
性能检查

方法 1 计算时间:1.6362712000000001

print(timeit.timeit("res = 0\n""for i in range(array.shape[0] - 1, -1, -1):\n""    if array[i] == 0:\n""        res += 1\n""    else:\n""        break",setup="import numpy as np\n""array = np.array([0] * 30000 + [i for i in range(1, 1000001)] + [0] * 70000)",number=100
))

方法 2 计算时间:0.4067506000000001

因为使用了 numpy 函数替代了 Python 的原生循环,因此性能提升较多。

print(timeit.timeit("np.count_nonzero(np.cumsum(array[::-1]) == 0)",setup="import numpy as np\n""array = np.array([0] * 30000 + [i for i in range(1, 1000001)] + [0] * 70000)",number=100
))

方法 3 计算时间:0.33288949999999984

因为节省了一次计算数组中元素是否等于 0 的判断操作,因此性能有所提升。

print(timeit.timeit("array.shape[0] - np.count_nonzero(np.cumsum(array[::-1]))",setup="import numpy as np\n""array = np.array([0] * 30000 + [i for i in range(1, 1000001)] + [0] * 70000)",number=100
))

相关内容

热门资讯

重庆银行上半年净利预增超10%... 7月20日晚间,渝农商行(601077.SH)、重庆银行(601963.SH)及浦发银行(60000...
原创 我... 港口上集装箱堆得像小山,工厂里流水线一刻不停,可走进商场,柜台前的人却没那么多。这种反差,几乎每个中...
国货香氛想用线香赶超国际品牌 界面新闻记者 | 周芳颖 界面新闻编辑 | 楼婍沁 消费者梁琦告诉界面时尚,每天上班前,她都会在...
韩股去杠杆已近尾声?融资余额降... 财联社7月21日讯(编辑 史正丞)最新数据显示,韩国股市近一个月激烈的“去杠杆”进程,已经将韩国股民...
外贸找货别只会上1688,这几... 刚做外贸那会儿,我也以为找个工厂就是打开1688搜一下的事。结果要么找到的是贸易商,转手加价30%;...
京东“业采融合”模式入选埃森哲... 近日,2026 世界人工智能大会(WAIC)在上海举办,京东以“AI 进入物理世界”为核心主题,集中...
长鑫科技最新公告 7月21日晚间,长鑫科技集团股份有限公司(简称“长鑫科技”)发布首次公开发行股票并在科创板上市的公告...
张柏芝被曝得知谢贤病重后 提前... (来源:梨视频) 据港媒报道,得知谢贤病重之时,张柏芝已火速安排远在澳洲上学的大儿子谢振轩(Luca...
最新中国500强出炉!15家豫... 据河南发布,今年500家上榜的中国公司在2025年的总营业收入达到14.26万亿美元,接近中国当年G...
哈尔滨ICL晶体植入:就诊机构... 随着屈光矫正技术持续迭代升级,近视手术凭借微创、恢复快的特点,成为学生、上班族、体检人群主流的摘镜方...
主力资金丨主力大手笔加仓名单出... 14个行业获主力资金净流入。 据证券时报·数据宝统计,今日(7月21日)沪深两市主力资金净流入170...
美股存储芯片大涨:闪迪涨超10... 记者|杜宇 编辑|何小桃 杜恒峰 校对|金冥羽 北京时间7月21日晚,美股三大指数高开后震荡。 截至...
医院送药机器人是什么?三甲医院... 随着国内智慧医院数字化改造持续推进,药房作为全院药品流转核心枢纽,人工配送模式的短板逐步凸显。高峰时...
又一百亿估值AI独角兽诞生!被... @智东西 作者 | 茄子 编辑 | 程茜 智东西7月21日消息,昨日,英国AI材料发现初创公司Cus...
*ST亿晶预重整的算盘与隐患:... 有着“A股光伏组件第一股”之称*ST亿晶(600537.SH),日前披露了上交所对其签署重整投资协议...
侨银股份、润建股份在广州成立合... 每经AI快讯,天眼查App显示,近日,拓肯(广东)技术服务有限公司成立,法定代表人为韩霜铭,注册资本...
袁记云饺港股上市获备案:年入2... 《星岛》记者 陈奇杰 深圳报道 7月17日,证监会网站显示,袁记食品集团股份有限公司(下称“袁记云饺...
小哥引擎完成A轮融资 2026年7月20日,上海小哥引擎网络技术有限公司(简称“小哥引擎”)宣布完成A轮融资。此次融资将主...
兴业基金总经理李辉因个人原因离... 7月21日,兴业基金发布高级管理人员变更公告,总经理李辉因个人原因离任,董事长刘宗治代任总经理职务,...