永恒python地速_立竿见影地把你的 Python 代码提速7倍

之前曾经测试计算斐波那契数列的几种方法,其中基于递归的方法是速度最慢的,例如计算第 40 项的值,需要 36 秒。如下图所示。

要提高运算速度,根本办法当然是改进算法。不过算法的提高是一个长期积累加上灵机一动的过程。我们今天要讲的,是一个不费脑筋,立竿见影的方法——把 Python 代码编译成 C 语言代码。通过 C 语言的运行效率来加速计算过程。

这个过程看起来很复杂,但实际上你并不需要编写一行 C 语言代码。你需要做的只是使用一个叫做 Cython 的库把 Python 代码编译为 C 语言代码即可。

首先我们来安装 Cython,就像安装普通的第三方库一样:

python3 -m pip install cython

安装完成以后,我们单独写计算斐波那契数列的函数:

def fib(n):

if n in [1, 2]:

return 1

return fib(n - 1) + fib(n - 2)

非常简单的递归写法。然后关键来了,我们要把这个文件保存为fast_fib.pyx。注意后缀是.pyx。如下图所示:

然后我们创建一个setup.py文件,文件内容如下:

from setuptools import setup

from Cython.Build import cythonize

setup(ext_modules=cythonize('fast_fib.pyx'))

如下图所示:

这个文件的作用,就是调用 Cython 的cythonize函数把 Python 代码转换为 C 代码。

接下来,开始编译代码,执行如下命令:

python3 setup.py build_ext --inplace

我的 Python 是 Python3.7,所以运行完成以后,会生成一个fast_fib.cpython-37m-darwin.so,如果你的 Python 是3.8,这个文件名可能是fast_fib.cpython-38m-darwin.so。这个文件你可以改名字,例如改成fast_fib.so。

还有一个文件叫做fast_fib.c。不过你不用打开这个文件,因为它有3200多行。并且你甚至可以直接把它删掉。真正有用的只有这个fast_fib.cpython-38m-darwin.so文件。

你需要做的,仅仅是直接调用你的函数。我们另外创建一个文件test_fast_fib.py,内容如下:

import time

from fast_fib import fib

start = time.time()

result = fib(40)

end = time.time()

print(f'斐波拉契数列第40项为:{result},耗时:{end - start}秒')

运行效果如下图所示:

计算斐波那契数列第40项只需要5秒钟,速度妥妥变成 Python 版本的7倍。

使用 Cython,不仅可以提高程序的运行速度,还可以把你的核心代码转换为.so文件,防止别人反编译看到你的代码。

关于 Cython 的更多介绍,请阅读它的官方文档[1]

有同学可能会问,当前文件夹下面既然有fast_fib.pyx文件,为什么当我们执行from fast_fib import fib的时候,不会从这个文件里面导入 Python 版本的代码?

这是因为,import只会从后缀为.py/.pyc/.pyo/.so的文件中导入模块,不会进入.pyx文件中寻找。

参考资料

[1]

官方文档: https://cython.readthedocs.io/

本文由 进击的Coder 发布在 ITPUB,转载此文请保持文章完整性,并请附上文章来源(ITPUB)及本页链接。

原文链接:http://www.itpub.net/2020/04/17/5877/

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

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

相关文章

顶尖大学实验室的科研方法_这是来自顶尖大学的5门免费自然语言处理课程

顶尖大学实验室的科研方法Data Science continues to be a hot topic, but more specifically, Natural Language Processing (NLP) is increasing in demand.数据科学仍然是一个热门话题,但更具体地说,自然语言处理(NLP)的需求正在增长。 Broadly spea…

Python学习---django知识补充之CBV

Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> 类 CBV[function based view] 用类和URL进行匹配 POSTMAN插件 http://blog.csdn.net/zzy1078689276/article/details/77528249 基于CBV的登…

「CH2101」可达性统计 解题报告

CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。N,M≤30000。 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边。 输出格式 共N行,表示每个点能够…

蓝图解锁怎么用_[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)

不说废话,先上个演示图最终成果(脚印,雪地可慢慢恢复,地形可控制)主要原理(白话文):假如你头上是块白色并且可以透视的平地,来了个非洲兄弟踩上面,你拿起单反…

数据预处理工具_数据预处理

数据预处理工具As the title states this is the last project from Udacity Nanodegree. The goal of this project is to analyze demographics data for customers of a mail-order sales company in Germany.如标题所示,这是Udacity Nanodegree的最后一个项目。…

这几日英文大汇

int > 整数. 主要⽤用来进⾏行行数学运算 str > 字符串串, 可以保存少量量数据并进⾏行行相应的操作 bool>判断真假, True, False list> 存储⼤大量量数据.⽤用[ ]表⽰示 tuple> 元组, 不可以发⽣生改变 ⽤用( )表⽰示 dict>字典,保存键值对,⼀一样可以…

在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享

在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享:关于基站定位方面的介绍:http://tech.c114.net/164/a140837.html开发方面的帮助:http://www.dotblogs.com.tw/kylin/archive/2009/08/09/9964.aspxhttp://code.google.com…

background图片叠加_css怎么让两张图片叠加,不用background只用img叠加

展开全部css层叠图片代码://这个层为外面的父层,只需设置相对位置样式即可//这个为里e69da5e887aa3231313335323631343130323136353331333431363030面要叠加的层,只需设置绝对样式//这个为层里面的内容图片//这个为父层内容或者:扩…

“入乡随俗,服务为主” 发明者量化兼容麦语言啦!

5年时光 我们裹挟前行。发明者量化从筚路蓝缕到步履蹒跚,从以“区块链资产交易”为阵地,再到以“内外盘商品期货”为依托。再到今天全面兼容“麦语言”。每一步,我们始终都在为建立一个优秀的量化交易平台而努力。 什么是麦语言? …

自考数据结构和数据结构导论_我跳过大学自学数据科学

自考数据结构和数据结构导论A few months back, I decided I wanted to learn data science. In order to do this, I skipped an entire semester of my data science major.几个月前,我决定要学习数据科学。 为此, 我跳过了数据科学专业的整个学期。 …

爬取LeetCode题目——如何发送GraphQL Query获取数据

前言 GraphQL 是一种用于 API 的查询语言,是由 Facebook 开源的一种用于提供数据查询服务的抽象框架。在服务端 API 开发中,很多时候定义一个接口返回的数据相对固定,因此要获得更多信息或者只想得到某部分信息时,基于 RESTful AP…

python中的thread_Python中的thread

测试代码import threadingimport timedef do_thread_test():print start thread time:, time.strftime(%H:%M:%S)time.sleep(5)print stop thread time:, time.strftime(%H:%M:%S)threads []for i in range(2):thread1 threading.Thread(targetdo_thread_test)thread1.setDae…

--附加数据库失败

--附加数据库失败1.产生失败的原因比如有个数据库,名叫HIMS,它的数据文件HIMS_Data.mdf和日志文件HIMS_Log.ldf,都放在路径c:/Program Files/Microsoft SQL Server/MSSQL/data/下。但是这个数据库天天跑日志,会产生上G的日志,现在通过企业管理…

十三、原生爬虫实战

一、简单实例 1、需求:爬取熊猫直播某类主播人气排行 2、了解网站结构 分类——英雄联盟——"观看人数" 3、找到有用的信息 二、整理爬虫常规思路 1、使用工具chrome——F12——element——箭头——定位目标元素 目标元素:主播名字&#xff0c…

归一化 均值归一化_归一化折现累积收益

归一化 均值归一化Do you remember the awkward moment when someone you had a good conversation with forgets your name? In this day and age we have a new standard, an expectation. And when the expectation is not met the feeling is not far off being asked “w…

sqlserver垮库查询_Oracle和SQLServer中实现跨库查询

一、在SQLServer中连接另一个SQLServer库数据在SQL中,要想在本地库中查询另一个数据库中的数据表时,可以创建一个链接服务器:EXEC master.dbo.sp_addlinkedserver server N别名, srvproductN库名,providerNSQLOLEDB, datasrcN服务器地址EXEC…

Angular2+ typescript 项目里面用require

在typescript里面怎么使用require方法呢? const jQuery require(jquery); const fip require( fonticonpicker/fonticonpicker )( jQuery ); 如果什么都不做,直接在项目里面使用,会得到以下错误: Cannot find name require 以下…

机器学习实践三---神经网络学习

Neural Networks 在这个练习中,将实现神经网络BP算法,练习的内容是手写数字识别。Visualizing the data 这次数据还是5000个样本,每个样本是一张20*20的灰度图片fig, ax_array plt.subplots(nrows10, ncols10, figsize(6, 4))for row in range(10):fo…

Microsoft Expression Blend 2 密钥,key

Microsoft Expression Blend 2 密钥,key,序列TJ2R3-WHW22-B848T-B78YJ-HHJWJ号

ethereumjs/ethereumjs-common-3-test

查看test能够让你更好滴了解其API文档的使用 ethereumjs-common/tests/chains.js const tape require(tape) const Common require(../index.js)tape([Common]: Initialization / Chain params, function (t) {t.test(Should initialize with chain provided, function (st) …