【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
))

相关内容

热门资讯

广东工行:制造业贷款余额近45... 2月24日,广东省高质量发展大会顺利召开,会议以“制造业与服务业协同发展”为主题,对广东产业融合发展...
可靠股份“开除”独董引争议,董... 可靠股份(301009.SZ)日前发布《关于解除公司独立董事职务的公告》称,独立董事景乃权丧失独立性...
SHEIN创始人许仰天罕见公开... 界面新闻记者 | 黄姗 界面新闻编辑 | 许悦 2月24日,跨境快时尚电商公司SHEIN希音创始...
雷军春节同款滑雪服意外出圈 3... 快科技2月24日消息,近日,小米创办人、董事长兼CEO雷军晒出春节滑雪照,引发网友热议。 有眼尖网...
盛合晶微科创板IPO成功过会! 2月24日,上海证券交易所上市审核委员会2026年第6次审议会议召开,审议结果显示,盛合晶微半导体有...
商道创投网·会员动态|华封集芯... 《商道创投网》2026年2月24日从官方获悉:北京华封集芯电子有限公司(以下简称"华封集芯")近日完...
原创 乌... 欧洲的能源局势再次迎来剧变。刚刚从友谊管道断供的阴影中稍作喘息,匈牙利和斯洛伐克又宣布暂停向乌克兰供...
再添1家,郑州“商转公贷款”直... 据郑州发布消息,2月24日,从郑州市住房公积金管理中心获悉,中国工商银行股份有限公司郑州商都路支行已...
原创 北... 北京北边这片地方,原来是农田和废弃地带。1998年,昌平区东小口镇被定为经济适用房重点开发区。次年,...
春节期间上海口岸进出境旅客超1... 本文转自【澎湃新闻】; 2月24日,澎湃新闻记者从上海海关获悉,2026年春节期间(2月15日-2月...
深圳诞生首家百亿级具身智能独角... 深圳商报·读创客户端首席记者 袁静娴 2月23日,全球机器人基础模型龙头企业智平方宣布完成B轮融资,...
原创 能... 在全球政治经济的博弈中,乌克兰再次进入了国际舆论的焦点。这一次,泽连斯基似乎采取了一个不容忽视的战略...
2.24犀牛财经晚报:27只基... 27只基金密集提示溢价风险 多只QDII与LOF产品在列 马年A股首个交易日,27只基金集中发布溢价...
阳光财险:护航餐饮安全 守护舌... 又是一年新春佳节来临,餐饮消费迎来旺季。阳光财险将专业、贴心服务融入新春餐饮消费场景,通过食品安全责...
外媒:美投资者撤离华尔街步伐加... 参考消息网2月24日报道据路透社2月20日报道,在美国科技巨头的回报逐渐减少、而表现更优的海外市场愈...
原创 欧... 如今的欧洲,正面临前所未有的困境。名义上,欧盟依然是全球第二大经济体,但实际上,欧盟内部早已四分五裂...
BAT冲进“亿级俱乐部”,AI... 文 | 硅基研究室 Judy 如果说2025年的春节,是DeepSeek这匹黑马的独舞,让“模型”...
原创 激... 激活民营经济一池春水 ——写在湖南“新春第一会”召开之际 长沙晚报掌上长沙2月24日讯 据湖南日报...
原创 急... 隔夜,现货黄金一度上涨超2%或超110美元,突破5200美元关口,刷新日高至5237.54美元。此前...
还说别人蒸馏?马斯克抨击Ant... 凤凰网科技讯 北京时间2月24日,对于美国AI创业公司Anthropic指控其他公司“蒸馏”其模型一...