为什么numba不能提高背包功能的速度?
我尝试使用numba加快代码速度,但似乎不起作用。 该程序用@jit
, @njit
或纯python花费相同的时间(约10秒)。 但是我用了numpy而不是list或dict。
这是我的代码:
import numpy as np
from numba import njit
import random
import line_profiler
import atexit
profile = line_profiler.LineProfiler()
atexit.register(profile.print_stats)@njit
def knapSack(W, wt, val, n):K = np.full((n+1,W+1),0)N = np.full((n+1,W+1,W+1),0)M = np.full((n+1,W+1),0)for i in range(n+1):for w in range(W+1):if i==0 or w==0:K[i][w] = 0elif wt[i-1] <= w:if(val[i-1] + K[i-1][w-wt[i-1]] > K[i-1][w]):K[i][w] = val[i-1] + K[i-1][w-wt[i-1]]c = N[i-1][w-wt[i-1]]c[i] = iN[i][w] = celse:K[i][w] = K[i-1][w]N[i][w] = N[i-1][w]else:K[i][w] = K[i-1][w]N[n][W][0] = K[n][W]return N[n][W]@profile
def main():size = 1000val = [random.randint(1, size) for i in range(0, size)]wt = [random.randint(1, size) for i in range(0, size)]W = 1000n = len(val)a = knapSack(W, wt, val, n)
main()
===============>>#1 票数:1 已采纳
实际上,在不更改方法本身的情况下,实际上不可能真正提高当前算法的性能。
您的N
数组包含大约10亿个对象( 1001 * 1001 * 1001
)。 您需要设置每个元素,因此您至少要进行十亿次操作。 为了获得一个下限,我们假设设置一个数组元素需要一纳秒(实际上会花费更多的时间)。 10亿次操作,每个操作需要1纳秒,这意味着需要1秒才能完成。 就像我说的那样,每次操作可能要花费比1纳秒更长的时间,所以让我们假设它需要10纳秒(可能有点高,但比1纳秒更现实),这意味着我们总共需要10秒钟的算法。
因此,您输入的预期运行时间将在1秒到10秒之间。 因此,如果您的Python版本需要10秒钟,则可能已经是您选择的方法所能达到的极限,并且没有任何工具能够(显着)改善运行时间。
可能会使速度更快的一件事是使用np.zeros
而不是np.full
:
K = np.zeros((n+1, W+1), dtype=int)
N = np.zeros((n+1, W+1, W+1), dtype=int)
并且不要创建M
因为您将不使用它。
由于您已经使用过line-profiler,所以我决定看一下,结果如下:
Line # Hits Time Per Hit % Time Line Contents
==============================================================3 def knapSack(W, wt, val, n):4 1 19137.0 19137.0 0.0 K = np.full((n+1,W+1),0)5 1 19408592.0 19408592.0 28.1 N = np.full((n+1,W+1,W+1),0)6 7 1002 6412.0 6.4 0.0 for i in range(n+1):8 1003002 4186311.0 4.2 6.1 for w in range(W+1):9 1002001 4644031.0 4.6 6.7 if i==0 or w==0:10 2001 19663.0 9.8 0.0 K[i][w] = 011 1000000 5474080.0 5.5 7.9 elif wt[i-1] <= w:12 498365 9616406.0 19.3 13.9 if(val[i-1] + K[i-1][w-wt[i-1]] > K[i-1][w]):13 52596 902030.0 17.2 1.3 K[i][w] = val[i-1] + K[i-1][w-wt[i-1]]14 52596 578740.0 11.0 0.8 c = N[i-1][w-wt[i-1]]15 52596 295980.0 5.6 0.4 c[i] = i16 52596 1239792.0 23.6 1.8 N[i][w] = c17 else:18 445769 5100917.0 11.4 7.4 K[i][w] = K[i-1][w]19 445769 11677683.0 26.2 16.9 N[i][w] = N[i-1][w]20 else:21 501635 5801328.0 11.6 8.4 K[i][w] = K[i-1][w]22 1 16.0 16.0 0.0 N[n][W][0] = K[n][W]23 1 14.0 14.0 0.0 return N[n][W]
这表明瓶颈为np.full
, N[i][w] = N[i-1][w]
和if(val[i-1] + K[i-1][w-wt[i-1]] > K[i-1][w])
。 Numba不会改进前两个代码,因为它们已经使用了高度优化的NumPy代码,而numba可能会更慢一些。 Numba可能可以改善if(val[i-1] + K[i-1][w-wt[i-1]] > K[i-1][w])
但这可能不会引起注意。
如果np.full
替换为np.zeros
则配置文件会稍有变化:
Line # Hits Time Per Hit % Time Line Contents
==============================================================3 def knapSack(W, wt, val, n):4 1 747.0 747.0 0.0 K = np.zeros((n+1, W+1),dtype=int)5 1 109592.0 109592.0 0.2 N = np.zeros((n+1, W+1, W+1),dtype=int)6 7 1002 4230.0 4.2 0.0 for i in range(n+1):8 1003002 4414071.0 4.4 7.0 for w in range(W+1):9 1002001 4836807.0 4.8 7.7 if i==0 or w==0:10 2001 22282.0 11.1 0.0 K[i][w] = 011 1000000 5646859.0 5.6 8.9 elif wt[i-1] <= w:12 521222 10389581.0 19.9 16.5 if(val[i-1] + K[i-1][w-wt[i-1]] > K[i-1][w]):13 47579 784563.0 16.5 1.2 K[i][w] = val[i-1] + K[i-1][w-wt[i-1]]14 47579 509056.0 10.7 0.8 c = N[i-1][w-wt[i-1]]15 47579 362796.0 7.6 0.6 c[i] = i16 47579 1975916.0 41.5 3.1 N[i][w] = c17 else:18 473643 5579823.0 11.8 8.8 K[i][w] = K[i-1][w]19 473643 22805846.0 48.1 36.1 N[i][w] = N[i-1][w]20 else:21 478778 5664271.0 11.8 9.0 K[i][w] = K[i-1][w]22 1 16.0 16.0 0.0 N[n][W][0] = K[n][W]23 1 10.0 10.0 0.0 return N[n][W]
但是主要瓶颈仍然是N[i][w] = N[i-1][w]
,使用numba可能比使用纯NumPy慢。 因此,再次使用numba对代码的其他一些部分所做的改进可能不会引起注意。
对于第一个配置文件,我使用了此版本的代码(第二个配置文件将np.full
更改为np.zeros
):
import numpy as npdef knapSack(W, wt, val, n):K = np.full((n+1,W+1),0)N = np.full((n+1,W+1,W+1),0)for i in range(n+1):for w in range(W+1):if i==0 or w==0:K[i][w] = 0elif wt[i-1] <= w:if(val[i-1] + K[i-1][w-wt[i-1]] > K[i-1][w]):K[i][w] = val[i-1] + K[i-1][w-wt[i-1]]c = N[i-1][w-wt[i-1]]c[i] = iN[i][w] = celse:K[i][w] = K[i-1][w]N[i][w] = N[i-1][w]else:K[i][w] = K[i-1][w]N[n][W][0] = K[n][W]return N[n][W]import random
size = 1000
val = [random.randint(1, size) for i in range(0, size)]
wt = [random.randint(1, size) for i in range(0, size)]
W = 1000
n = len(val)%lprun -f knapSack knapSack(W, wt, val, n)
===============>>#2 票数:0
这里是新功能:
@njitdef knapSack(W, wt, val, n):K = np.zeros((n + 1, W + 1),dtype=np.int32)# In fact we must only save the previous combinations and the current, # not all :) So N is considerably reduceN = np.zeros((2, W + 1, W + 1),dtype=np.int32)for i in range(n + 1):for w in range(W + 1):if i == 0 or w == 0:K[i][w] = 0elif wt[i - 1] <= w:if val[i - 1] + K[i - 1][w - wt[i - 1]] > K[i - 1][w]:K[i][w] = val[i - 1] + K[i - 1][w - wt[i - 1]]N[i%2][w] = np.copy(N[(i - 1)%2][w - wt[i - 1]])N[i%2][w][i] = ielse:K[i][w] = K[i - 1][w]N[i%2][w] = N[(i - 1)%2][w]else:K[i][w] = K[i - 1][w]N[(n)%2][W][0] = K[n][W]return N[(n)%2][W]
非常感谢 MSeifert!
为什么numba不能提高背包功能的速度?相关推荐
- oracle入库的速度能到多少_多线程能提高Oracle的入库速度吗
多线程能提高Oracle的入库速度吗 最近常常和同事们讨论"系统架构",其中有不免提到如何使用"多线程"来改善系统性能.有些同事普遍有一种"认为&qu ...
- Redis进阶实践之十八 使用管道模式提高Redis查询的速度
Redis进阶实践之十八 使用管道模式提高Redis查询的速度 原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来 ...
- autocad完全应用指南_如何提高CAD画图的速度?有哪些途径和技法?【AutoCAD教程】...
点击蓝色字关注我哟 ☀每天推送CAD软件安装及下载.CAD工具应用.CAD技巧.CAD教程.CAD素材.CAD疑难问题解答等文章 ☀想认识志同道合的朋友一起学习CAD?请加入我们的QQ群 369845 ...
- 程序员如何提高编程时打字速度的5个Tips
文章目录 程序员如何提高编程时打字速度 前言 打字速度等级 测试编程时打字速度 提高编程时打字速度的5个Tips Tips1: 选用合适的键盘 Tips2: 保持正确的坐姿和打字姿势 Tips3: 选 ...
- 大学生学计算机打字速度,浅谈提高小学生计算机打字速度
提高小学生计算机打字速度 浅谈延安保小 景玉金 摘要: 如何尽快提高中高年级学生电脑打字速度就成为我校计算机教学非常重要的教学任务.解决打字速度问题只要做到提高孩子对打字练习的兴趣,有正确的坐姿,选择 ...
- 提高网页加载速度的一些方法和技巧
网页的加载速度是评估网站质量一个重要指标,原因在于大多数用户能够容忍的网页加载时间只有几秒,如果超出了访客的忍受范围他们会毫不留情地关掉你的网页,所以网页载入速度会极大地影响网站的流量和访问. 以下总 ...
- armadillo使用,armadillo提高编译效率和速度
Armadillo是一个全面的.基于模板的 C++ 线性代数库,设计有 LAPACK 和 ATLAS 库的替代接口. armadillo使用工具旨在提供速度和易用性,以及类似于 Matlab 的熟悉语 ...
- 优化/提高modelsim的仿真速度
背景 最近在做基于FPGA的CT图像重建算法仿真方面的工作,需要用Modelsim对算法部分的RTL代码进行功能仿真测试. 在用modelsim进行仿真时,发现仿真速度较慢,modelsim仿真1.2 ...
- 【PHP】如何提高网页加载速度?
[php]如何提高网页加载速度? 1.减少页面请求: 从WEB运行原理上讲,IIS请求是无状态的,在服务器端一直是连接和关闭的不断进行着,如果能减少服务器请求,总的时间将会减少. 之前我下载163邮箱 ...
最新文章
- 在app中从下向上滑动,以找到不在默认第一页的元素
- 学机械可以转计算机吗,本人合工大车辆工程大一新生,但是机械类前景都不太好,我要不要转计算机,求教?...
- AOP in Asp.net MVC
- python textwrap_python2.7.3编译python模块学习- textwrap 文本包装和填充
- SAP 电商云 Spartacus UI Delivery Mode ID 的 validator
- 阿里云专属数据库,重新定义云数据库新形态
- 脉位调制解调 matlab,基于matlab的am调制解调
- 序列标注模型结果评估模块seqeval学习使用
- android手势第一次设置密码_Android实现手势密码功能
- Yarn FairSheduler使用FairSharePolicy计算Fair Share的规则、原理和代码实现
- 创建选区快捷键是什么_ps选区的快捷键是什么
- 经典编程题——回文问题
- 如何用html来编写ppt,impress.js——用HTML“写”幻灯片
- bad assignment报错
- 2021-10-21 centos7+ nginx + uwsgi(包含一个配置上的天坑)
- Linux_网络_数据链路层协议 MAC帧/ARP协议 (以太网通信原理,MAC地址与IP地址的区分,MTU对IP/TCP/IP的影响,ARP协议及其通信过程)
- 【快速因数分解】Pollard's Rho 算法
- 云开发周公解梦微信小程序源码/支持流量主功能
- Windows系统下电脑强制卡死、关机的邪恶方法
- 计算机毕业设计Node.js校园二手拍卖网(源码+程序+LW+远程调试)