linux3.x内核实时性改进,linux 3.x内核优化指南

1.1。Numba的约5分钟指南 Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时,它被编译为机器代码“及时”执行,并且您的全部或部分代码随后可以以本机机器代码速度运行!

开箱即用的Numba使用以下方法:

操作系统:Windows(32位和64位),OSX和Linux(32位和64位) 架构:x86,x86_64,ppc64le。在armv7l,armv8l(aarch64)上进行实验。 GPU:Nvidia CUDA。AMD ROC的实验。 CPython的 NumPy 1.10 - 最新 1.1.1。我怎么得到它? Numba可作为畅达包为 蟒蛇Python发布:

$ conda install numba Numba还有pip可供选择:

$ pip install numba Numba也可以 从源代码编译,虽然我们不建议首次使用Numba用户。

Numba通常用作核心包,因此其依赖性保持在绝对最小值,但是,可以按如下方式安装额外的包以提供其他功能:

scipy- 支持编译numpy.linalg功能。 colorama - 支持回溯/错误消息中的颜色突出显示。 pyyaml - 通过YAML配置文件启用Numba配置。 icc_rt - 允许使用Intel SVML(高性能短矢量数学库,仅限x86_64)。安装说明在 性能提示中。 1.1.2。Numba会为我的代码工作吗? 这取决于你的代码是什么样的,如果你的代码是以数字为导向的(做了很多数学运算),经常使用NumPy和/或有很多循环,那么Numba通常是一个不错的选择。在这些例子中,我们将应用最基本的Numba的JIT装饰器,@jit试图加速一些函数来演示哪些有效,哪些无效。

Numba在代码看起来像这样:

from numba import jit import numpy as np

x = np.arange(100).reshape(10, 10)

@jit(nopython=True) # Set "nopython" mode for best performance def go_fast(a): # Function is compiled to machine code when called the first time trace = 0 for i in range(a.shape[0]): # Numba likes loops trace += np.tanh(a[i, i]) # Numba likes NumPy functions return a + trace # Numba likes NumPy broadcasting

print(go_fast(x)) 对于看起来像这样的代码,如果有的话,它将无法正常工作:

from numba import jit import pandas as pd

x = {'a': [1, 2, 3], 'b': [20, 30, 40]}

@jit def use_pandas(a): # Function will not benefit from Numba jit df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame df += 1 # Numba doesn't understand what this is return df.cov() # or this!

print(use_pandas(x)) 请注意,Numba不理解Pandas,因此Numba只是通过解释器运行此代码,但增加了Numba内部开销的成本!

1.1.3。什么是nopython模式? Numba @jit装饰器从根本上以两种编译模式运行, nopython模式和object模式。在go_fast上面的例子中, nopython=True在@jit装饰器中设置,这是指示Numba在nopython模式下操作。nopython编译模式的行为本质上是编译装饰函数,以便它完全运行而不需要Python解释器的参与。这是使用Numba jit装饰器的推荐和最佳实践方式,因为它可以带来最佳性能。

如果编译nopython模式失败,Numba可以编译使用 ,如果没有设置,这是装饰器的 后退模式(如上例所示)。在这种模式下,Numba将识别它可以编译的循环并将它们编译成在机器代码中运行的函数,并且它将运行解释器中的其余代码。为获得最佳性能,请避免使用此模式objectmode@jitnopython=Trueuse_pandas

1.1.4。如何衡量Numba的表现? 首先,回想一下,Numba必须为执行函数的机器代码版本之前给出的参数类型编译函数,这需要时间。但是,一旦编译完成,Numba会为所呈现的特定类型的参数缓存函数的机器代码版本。如果再次使用相同的类型调用它,它可以重用缓存的版本而不必再次编译。

测量性能时,一个非常常见的错误是不考虑上述行为,并使用一个简单的计时器来计算一次,该计时器包括在执行时编译函数所花费的时间。

例如:

from numba import jit import numpy as np import time

x = np.arange(100).reshape(10, 10)

@jit(nopython=True) def go_fast(a): # Function is compiled and runs in machine code trace = 0 for i in range(a.shape[0]): trace += np.tanh(a[i, i]) return a + trace

DO NOT REPORT THIS... COMPILATION TIME IS INCLUDED IN THE EXECUTION TIME!

start = time.time() go_fast(x) end = time.time() print("Elapsed (with compilation) = %s" % (end - start))

NOW THE FUNCTION IS COMPILED, RE-TIME IT EXECUTING FROM CACHE

start = time.time() go_fast(x) end = time.time() print("Elapsed (after compilation) = %s" % (end - start)) 这,例如打印:

Elapsed (with compilation) = 0.33030009269714355 Elapsed (after compilation) = 6.67572021484375e-06 衡量Numba JIT对您的代码的影响的一个好方法是使用timeit模块函数来执行时间,这些函数测量多次执行迭代,因此可以在第一次执行时适应编译时间。

作为旁注,如果编译时间成为问题,Numba JIT支持 编译函数的磁盘缓存,并且还具有Ahead-Of-Time编译模式。

1.1.5。它有多快? 假设Numba可以在nopython模式下运行,或者至少编译一些循环,它将针对您的特定CPU进行编译。加速因应用而异,但可以是一到两个数量级。Numba有一个 性能指南,涵盖了获得额外性能的常用选项。

1.1.6。Numba如何运作? Numba读取装饰函数的Python字节码,并将其与有关函数输入参数类型的信息相结合。它分析并优化您的代码,最后使用LLVM编译器库生成函数的机器代码版本,根据您的CPU功能量身定制。每次调用函数时都会使用此编译版本。

1.1.7。其他感兴趣的东西: Numba有相当多的装饰,我们看到@jit和@njit,但也有:

@vectorize- 生成NumPy ufunc(ufunc支持所有方法)。文件在这里。 @guvectorize- 产生NumPy广义ufuncs。 文件在这里。 @stencil - 将函数声明为类似模板操作的内核。 文件在这里。 @jitclass - 对于jit感知类。文件在这里。 @cfunc - 声明一个函数用作本机回调(从C / C ++等调用)。文件在这里。 @overload- 注册您自己的函数实现,以便在nopython模式下使用,例如@overload(scipy.special.j0)。 文件在这里。 一些装饰者提供额外选项:

parallel = True- 启用功能的 自动并行化。 fastmath = True- 为该功能启用快速数学行为。 ctypes / cffi / cython互操作性:

cffi- 模式支持调用CFFI函数nopython。 ctypes- 模式支持调用ctypes包装函数nopython。。 Cython导出的函数是可调用的。 1.1.7.1。GPU目标: Numba可以针对Nvidia CUDA和(实验性)AMD ROC GPU。您可以使用纯Python编写内核,让Numba处理计算和数据移动(或明确地执行此操作)。单击关于CUDA或ROC的 Numba文档 。

示例:接下来我们写一段简单的代码,来计算一下执行时间:

示例1:不使用numba的:

import time

def num():

arr = []

for i in range(10000000):

arr.append(i)

stime = time.time() num() etime = time.time() - stime

print(arr)

print('用时:{}秒'.format(etime)) 示例输出时间:

用时:1.4500024318695068秒

示例2:使用numba @jit

import time from numba import jit

@jit def num():

arr = []

for i in range(10000000):

arr.append(i)

stime = time.time() num() etime = time.time() - stime

print(arr)

print('用时:{}秒'.format(etime)) 示例输出:

用时:0.5530002117156982秒

结论:

上述两个示例代码,一个使用了numba,另一个没有使用numba;可以看出使用numba @jit装饰后,时间明显快了很多倍。

这只是一个简单示例;对于复杂计算提高速度更明显。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 控制终端卡,配置通过串口控制linux操作系统的终端

开始之前,请确认机器有串口(com口, RS232接口),如果没有,那就没有办法达到通过串口控制机器的目的了。当然,也可以额外给机器安装一个带串口的 PCI 模块,然后想办法将模块驱动起来(内核默认能驱动就最好了)&#xff0c…

【LeetCode笔记】169. 多数元素(Java、摩尔投票法、哈希表)

文章目录题目描述思路 & 代码思路一&#xff1a;哈希表思路二&#xff1a; 摩尔投票法题目描述 好家伙&#xff0c;这是今天最有意思的题目了 思路 & 代码 思路一&#xff1a;哈希表 先说缺点&#xff1a;空间复杂度O(n)一次遍历&#xff0c;记录<数组存储值&a…

Linux环境下怎么使用pip,linux下pip的安装步骤及使用详解

linux下pip的安装步骤及使用详解pip类似RedHat里面的yum&#xff0c;安装软件非常方便。下面话不多说&#xff0c;来看看详细的介绍&#xff1a;pip下载&#xff1a;# wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5834b2904f92d46aaa33326pi…

【LeetCode笔记】206. 反转链表(Java、迭代、递归、链表)

啊好久没更文了&#xff0c;前两天状态不太好。还是要坚持更文敲题噢&#xff01; 文章目录题目描述思路 & 代码题目描述 面试高频题&#xff0c;需要会用两种方法解决&#xff01;&#xff08;迭代 and 递归&#xff09;其实先写出迭代&#xff0c;递归就不难写了。 思…

当你抛弃windows使用linux,当我们厌倦了Windows系统还能考虑什么样的桌面操作系统?...

如果你厌倦了Windows&#xff0c;我们该选择什么样的操作系统&#xff1f;时间告诉我们&#xff0c;任何事物都不会一成不变&#xff0c;当我们厌倦了Windows那天到来&#xff0c;不妨考虑换个操作系统&#xff0c;即便Windows操作系统在市场依然如日中天&#xff0c;旧的不去新…

【LeetCode笔记】234. 回文链表(Java、快慢指针、链表)

文章目录题目描述思路 & 算法题目描述 写这道题前最好把206.翻转链表 写了有空间复杂度的话都好说&#xff0c;不管是新建链表、还是用字符串equals都好做。 思路 & 算法 快慢指针&#xff1a; 快指针找终点&#xff0c;慢指针反转前半个链表快指针回到慢指针的位…

vs2010 编译linux,VS2010 Boost编译安装

2.解压缩到D:\boost 目录下3.编译bjam(1)从vs2010的工具菜单进入命令提示窗口(单击“开始”按钮&#xff0c;指向“所有程序”&#xff0c;指向“Microsoft Visual Studio 2010”&#xff0c;指向“Visual Studio tools(工具)”&#xff0c;然后单击“Visual Studio 2010 comma…

【LeetCode笔记】200. 岛屿数量(Java、DFS)

文章目录题目描述代码 & 思路更新代码题目描述 直接毁岛&#xff01;每次发现一个岛&#xff0c;ans&#xff0c;然后直接把整个岛毁了&#xff08;感染&#xff09;直到最后&#xff0c;找出所有岛&#xff0c;此时地图上全都是’0’ 代码 & 思路 每次找到一个岛&…

linux统计代码注释率,统计代码注释率

#!/bin/bash#program:# 分析.c,.cpp文件,计算文件行总数&#xff0c;代码行总数&#xff0c;注释行总数&#xff0c;空白行总数&#xff0c;代码注释率# 注释类型&#xff1a;# (1)行注释"//这里是注释内容"# (2)块注释"/*这里是注释内…

【LeetCode笔记】155. 最小栈(Java、栈)

文章目录题目描述思路 & 代码更新版题目描述 用空间换时间的经典例子&#xff0c;唯一要解决的地方就是 getMin() 如何实现常数检索&#xff08;貌似也是面试常考题&#xff09; 思路 & 代码 既然想快&#xff0c;那就要付出空间的代价用什么空间可以实现&#xff…

linux win7 默认启动,请教:我的grub.cfg里面的内容如下,请教怎样改代码才能让WIN7设为默认启动...

请教&#xff1a;我的grub.cfg里面的内容如下&#xff0c;请教怎样改代码才能让WIN7设为默认启动发布时间:2011-09-24 15:43:24来源:红联作者:baiguanglin## DO NOT EDIT THIS FILE## It is automatically generated by grub-mkconfig using templates# from /etc/grub.d and s…

【LeetCode笔记】198. 打家劫舍(Java、动态规划)

文章目录题目描述思路 & 代码更新版题目描述 好家伙&#xff0c;真是一道不符合社会主义价值观的题目不过我们还是要把这道题做了&#xff0c;而且还得用上动态规划 思路 & 代码 首先&#xff0c;不能打劫相邻然后&#xff0c;房屋都是非负整数&#xff08;讲道理&…

【LeetCode笔记】617. 合并二叉树(Java、DFS、二叉树)

文章目录题目描述思路 & 代码更新版题目描述 貌似是面试高频题&#xff0c;显而易见的递归。 思路 & 代码 合并两棵树&#xff0c;先不考虑特殊情况&#xff0c;可以理解成&#xff1a;根结点合并&#xff0c;然后各自的左右子树继续进行合并操作。那么递归返回值肯…

linux 重定向 不换行,Ada:重定向到stdout时省略换行符(测试Put)

我正在尝试用简单的方法编写测试Ada.Text_IO.Put.为简单起见,这是一个我想测试的组合方法:procedure Say_Something isbeginPut("Something.");end Say_Something;在我的AUnit测试中,我有:procedure Test_Put (T : in out Test) ispragma Unreferenced (T);use Ada.T…

【LeetCode笔记】226. 翻转二叉树(Java、递归)

文章目录题目描述代码 & 思路更新版题目描述 感觉和合并二叉树类似&#xff0c;都是很好进行递归的问题 代码 & 思路 翻转当前结点的左、右结点对当前结点的左、右结点进行翻转函数【自底向上】 /*** Definition for a binary tree node.* public class TreeNode …

virtualbox linux 分辨率,终于搞定了VirtualBox的ubuntu分辨率问题

曾经装了ubuntu&#xff0c;但是觉得和windows切换太麻烦了&#xff0c;要重启机器&#xff0c;导致的结果是linux装上了总是不用。这次决定使用虚拟机&#xff0c;因为我用ubuntu就是ssh一下实验室的服务器&#xff0c;所以对性能没什么要求。在所里的时候看到祝师兄总用vmwar…

【LeetCode笔记】160. 相交链表(Java、链表)

文章目录题目描述思路 & 代码题目描述 感谢这道题&#xff0c;让我更加了解到Dalao们思路的nb主要是满足空间复杂度O(1)。否则用哈希表不难实现。 思路 & 代码 有相交结点的情况下&#xff0c;可以找到这么一个等式&#xff1a; // 假设链表长度为m&#xff0c;n&…

linux 离线安装nfs,ubuntu 上离线安装包制作与安装之NFS搭建

在Ubuntu上离线搭建NFS服务器一、制作离线软件包在联网且环境与你相同的电脑上 制作离线软件包注&#xff1a;先查看有没有安装nfs-utils的安装包 命令&#xff1a;# rpm -q nfs-utils1、下载软件所需deb包#sudo apt-get install nfs-kernel-server下载后安装包在/var/cache/ap…

【LeetCode笔记】152. 乘积最大子数组(Java、动态规划)

文章目录题目描述思路 & 代码更新版题目描述 考虑正数、负数和0的情况 思路 & 代码 既然是使用的动态规划&#xff0c;那么有以下几点&#xff1a; 维护什么&#xff1a;维护iMax和iMin&#xff0c;分别代表包含当前值的子数组的最大乘积 & 最小乘积什么时候转…

Linux安装winetim简单教程,[转载]wine安装最新版TIM

[版权声明&#xff1a;本文为转载&#xff0c;并按照个人实际操作步骤替换为了TIM安装&#xff0c;原文为QQ安装过程。]1. 安装wine本次教程只需要安装最新版本的wine&#xff0c;并不需要winetricks、wine-mono、wine-gecko等其他插件&#xff0c;目前经实际测试发现只运行Win…