首页 >>  正文

python怎么创建一个类

来源:baiyundou.net   日期:2024-09-21

丰色 发自 凹非寺

量子位 | 公众号 QbitAI

众所周知,Python的简单和易读性是靠牺牲性能为代价的——

尤其是在计算密集的情况下,比如多重for循环。

不过现在,大佬胡渊鸣说了:

只需import 一个叫做“Taichi”的库,就可以把代码速度提升100倍

不信?

来看三个例子。

计算素数的个数,速度x120

第一个例子非常非常简单,求所有小于给定正整数N的素数。

标准答案如下:

我们将上面的代码保存,运行。

当N为100万时,需要2.235s得到结果:

现在,我们开始施魔法。

不用更改任何函数体,import“taichi”库,然后再加两个装饰器:

Bingo!同样的结果只要0.363s,快了将近6倍。

如果N=1000万,则只要0.8s;要知道,不加它可是55s,一下子又快了70倍

不止如此,我们还可以在ti.init()中加个参数变为ti.init(arch=ti.gpu) ,让taich在GPU上进行计算。

那么此时,计算所有小于1000万的素数就只耗时0.45s了,与原来的Python代码相比速度就提高了120倍

厉不厉害?

什么?你觉得这个例子太简单了,说服力不够?我们再来看一个稍微复杂一点的。

动态规划,速度x500

动态规划不用多说,作为一种优化算法,通过动态存储中间计算结果来减少计算时间。

我们以经典教材《算法导论》中的经典动态规划案例“最长公共子序列问题(LCS)”为例。

比如对于序列a = [0, 1, 0, 2, 4, 3, 1, 2, 1]和序列b = [4, 0, 1, 4, 5, 3, 1, 2],它们的LCS就是:

LCS(a, b) = [0, 1, 4, 3, 1, 2]。

用动态规划的思路计算LCS,就是先求解序列a的前i个元素和序列b的前j个元素的最长公共子序列的长度,然后逐步增加i或j的值,重复过程,得到结果。

我们用f[i, j]来指代这个子序列的长度,即LCS((prefix(a, i), prefix(b, j)。其中prefix(a, i) 表示序列a的前i个元素,即a[0], a[1], …, a[i - 1],得到如下递归关系:

完整代码如下:

现在,我们用Taichi来加速:

结果如下:

胡渊鸣电脑上的程序最快做到了0.9秒内完成,而换成用NumPy来实现,则需要476秒,差异达到了超500倍!

最后,我们再来一个不一样的例子。

反应 - 扩散方程,效果惊人

自然界中,总有一些动物身上长着一些看起来无序但实则并非完全随机的花纹。

图灵机的发明者艾伦·图灵是第一个提出模型来描述这种现象的人。

在该模型中,两种化学物质(U和V)来模拟图案的生成。这两者之间的关系类似于猎物和捕食者,它们自行移动并有交互:

  1. 最初,U和V随机分布在一个域上;
  2. 在每个时间步,它们逐渐扩散到邻近空间;
  3. 当U和V相遇时,一部分U被V吞噬。因此,V的浓度增加;
  4. 为了避免U被V根除,我们在每个时间步添加一定百分比 (f) 的U并删除一定百分比 (k) 的V。

上面这个过程被概述为“反应-扩散方程”:

其中有四个关键参数:Du(U的扩散速度),Dv(V的扩散速度),f(feed的缩写,控制U的加入)和k(kill的缩写,控制V的去除)

如果Taichi中实现这个方程,首先创建网格来表示域,用vec2表示每个网格中U, V的浓度值。

拉普拉斯算子数值的计算需要访问相邻网格。为了避免在同一循环中更新和读取数据,我们应该创建两个形状相同的网格W×H×2。

每次从一个网格访问数据时,我们将更新的数据写入另一个网格,然后切换下一个网格。那么数据结构设计就是这样:

一开始,我们将U在网格中的浓度设置为 1,并将V放置在50个随机选择的位置:

那么实际计算就可以用不到10行代码完成:

","force_purephv":"0","gnid":"937e299d4c2c2a176","img_data":[{"flag":2,"img":[{"desc":"","height":"920","title":"","url":"https://p0.ssl.img.360kuai.com/t01e23794c94540b7d3.jpg","width":"920"},{"desc":"","height":"765","title":"","url":"https://p0.ssl.img.360kuai.com/t0144fb37a5bf3f53de.jpg","width":"1080"},{"desc":"","height":"227","title":"","url":"https://p0.ssl.img.360kuai.com/t0150b2fef7620e3dbc.jpg","width":"1080"},{"desc":"","height":"839","title":"","url":"https://p0.ssl.img.360kuai.com/t016b17cfbc73cc0857.jpg","width":"1080"},{"desc":"","height":"218","title":"","url":"https://p0.ssl.img.360kuai.com/t0179edf8404f9ae37d.jpg","width":"1080"},{"desc":"","height":"106","title":"","url":"https://p0.ssl.img.360kuai.com/t01e32851aaad11b65f.jpg","width":"1080"},{"desc":"","height":"179","title":"","url":"https://p0.ssl.img.360kuai.com/t01bec382de36100f5c.jpg","width":"1080"},{"desc":"","height":"1048","title":"","url":"https://p0.ssl.img.360kuai.com/t01d29f206b72759e5c.jpg","width":"952"},{"desc":"","height":"220","title":"","url":"https://p0.ssl.img.360kuai.com/t013e42423d8b222dd8.jpg","width":"1080"},{"desc":"","height":"200","title":"","url":"https://p0.ssl.img.360kuai.com/t01d2b2fb1751d67f82.jpg","width":"1080"},{"desc":"","height":"290","title":"","url":"https://p0.ssl.img.360kuai.com/t01a6e79e099eafb7c4.jpg","width":"732"},{"desc":"","height":"103","title":"","url":"https://p0.ssl.img.360kuai.com/t0120a647a3f436ce6b.jpg","width":"1080"},{"desc":"","height":"321","title":"","url":"https://p0.ssl.img.360kuai.com/t01758422991b7876fd.jpg","width":"1080"}]}],"original":0,"pat":"art_src_3,fts0,sts0","powerby":"hbase","pub_time":1662700080000,"pure":"","rawurl":"http://zm.news.so.com/ff7cacee7feffebd5b82b9dcf2d60187","redirect":0,"rptid":"aec5ec457dee7f65","s":"t","src":"量子位","tag":[],"title":"胡渊鸣:import一个“太极”库,让Python代码提速100倍

匡苛亨1494如何用python创建一个二元数组 -
凤陶才13564862764 ______ Python中创建二维列表/数组,即创建一个list,并且这个list的元素还是list.可以用列表解析的方法实现.创建例子如下:2d_list = [[0 for col in range(cols)] for row in range(rows)] 其中cols, rows变量替换为你需要的数值即可,例如:2d_list = [[0 for col in range(9)] for row in range(9)]# 9*9的二维列表

匡苛亨1494怎样创建可以在系统下运行 的 python 脚本 -
凤陶才13564862764 ______ Python安装好以后,在开始菜单会看到一个idle工具(一个增强的交互命令行解释器窗口)以及一个自带的编辑器.在任意目录新建一个.py文件或者保存的时候以.py结尾,用记事本、Python自带的编辑器或者其他编辑器如Sublime Text或者NotePad++都行.如果你使用的是idle,直接按F5就能在Python自带的命令行查看结果 如果是用记事本或者其他编辑器,快捷键win+R调出运行目录,输入cmd,然后在命令行里进入这个目录,输入python [filename].py或者[filename].py就可以看到运行结果了

匡苛亨1494如何创建和发布Python模块 -
凤陶才13564862764 ______ 系统环境:window xp sp3,python2.7 在D盘pydemo目录下创建一个nester目录(此目录为举例说明,属自定义) 在目录中添加两个python程序文件:nester.py和setup.py nester.py 模块的程序文件,代码如下(实现递归遍历数组)

匡苛亨1494python 如何新建一个新的File?
凤陶才13564862764 ______ new_path_filename包含文件路径和文件名,例如: new_path_filename = r'c:\windows\system32\ceshi' new_path_filename = r'\var\log\test' 在Linux下可以考虑使用系统的touch命令: os.system(r'touch %s' % new_path_filename) 在任何系统下都...

匡苛亨1494python3怎么自己创建一个模块并且调用(个人 -
凤陶才13564862764 ______ 首先创建一个文件a.py,里面有一个类A [python] view plain copy#coding:gbk #创建一个包含方法say_a_word的类A class A(object): def say_a_word(self): print "你好" 然后在创建一个b.py文件,里面引用模块a创建一个对象 [python] view plain ...

匡苛亨1494python如何创建文件夹 -
凤陶才13564862764 ______ 主要涉及到三个函数 1、os.path.exists(path) 判断一个目录是否存在 2、os.makedirs(path) 多层创建目录 3、os.mkdir(path) 创建目录 直接上代码 def mkdir(path): # 引入模块 import os # 去除首位空格 path=path.strip() # 去除尾部 \ 符号 path=...

匡苛亨1494如何用Python搭建一个网站 -
凤陶才13564862764 ______ 先从django入门,它的文档可以说是开源框架中最好的,循序渐进,适合新手.orm,mvc,url匹配,signal,http请求,session,cookie,缓存,web安全等概念都讲的很清晰,甚至在不怎么了解python的情况下也能硬着头皮把小项目做出来.(想做成大网站,一个框架是远远不够的,要学的东西太多了) django一个框架把web开发的大多数功能都搞定了,但也造成了框架本身比较重.如果对web开发有一定经验了,又需要一定的灵活性,可以看看flask.这是一个更新的生态系统.新的框架往往会取精华去糟粕,也意味着社区和配套的成熟度会逊色一些. 其他的python web也有很多,不过没怎么深入用过

匡苛亨1494pycharm 怎么自动创建python头文件 -
凤陶才13564862764 ______ 创建方法如下:进入File->settings->Editor->File and Code Templates->Python Script.添加以下内容:12345678910111213141516171819202122#!/usr/bin/env python# encoding: utf-8 """@version: .@author: phpergao@license: Apache ...

匡苛亨1494如何用python和web.py搭建一个网站 -
凤陶才13564862764 ______ 一、使用工具:python、web.py 二、搭建步骤: 1、 环境搭建. 安装python2.7.10,注意要把python路径加入系统环境变量.版本不能低于2.7.9,但不能用3.0以上,web.py支持不好.安装web.py, 官方网下载来装就行,记得是解压后进去:...

匡苛亨1494如何创建Python工程目录 -
凤陶才13564862764 ______ 如果你在 Mac OS X 或 Linux 下,下面两条命令可能会适用:$ sudo easy_install virtualenv 或更好的:$ sudo pip install virtualenv 上述的命令会在你的系统中安装 virtualenv.它甚至可能会存在于包管理器中, 如果你用的是 Ubuntu,可以尝试:$...

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024