python输出1到100的偶数
丰色 发自 凹非寺
量子位 | 公众号 QbitAI
众所周知,Python的简单和易读性是靠牺牲性能为代价的——
尤其是在计算密集的情况下,比如多重for循环。
不过现在,大佬胡渊鸣说了:
只需import 一个叫做“Taichi”的库,就可以把代码速度提升100倍!
![](https://p0.ssl.img.360kuai.com/t01e23794c94540b7d3.jpg)
不信?
来看三个例子。
计算素数的个数,速度x120
第一个例子非常非常简单,求所有小于给定正整数N的素数。
标准答案如下:
![](https://p0.ssl.img.360kuai.com/t0144fb37a5bf3f53de.jpg)
我们将上面的代码保存,运行。
当N为100万时,需要2.235s得到结果:
![](https://p0.ssl.img.360kuai.com/t0150b2fef7620e3dbc.jpg)
现在,我们开始施魔法。
不用更改任何函数体,import“taichi”库,然后再加两个装饰器:
![](https://p0.ssl.img.360kuai.com/t016b17cfbc73cc0857.jpg)
Bingo!同样的结果只要0.363s,快了将近6倍。
![](https://p0.ssl.img.360kuai.com/t0179edf8404f9ae37d.jpg)
如果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],得到如下递归关系:
![](https://p0.ssl.img.360kuai.com/t01e32851aaad11b65f.jpg)
完整代码如下:
![](https://p0.ssl.img.360kuai.com/t01bec382de36100f5c.jpg)
现在,我们用Taichi来加速:
![](https://p0.ssl.img.360kuai.com/t01d29f206b72759e5c.jpg)
结果如下:
![](https://p0.ssl.img.360kuai.com/t013e42423d8b222dd8.jpg)
胡渊鸣电脑上的程序最快做到了0.9秒内完成,而换成用NumPy来实现,则需要476秒,差异达到了超500倍!
最后,我们再来一个不一样的例子。
反应 - 扩散方程,效果惊人
自然界中,总有一些动物身上长着一些看起来无序但实则并非完全随机的花纹。
![](https://p0.ssl.img.360kuai.com/t01d2b2fb1751d67f82.jpg)
图灵机的发明者艾伦·图灵是第一个提出模型来描述这种现象的人。
在该模型中,两种化学物质(U和V)来模拟图案的生成。这两者之间的关系类似于猎物和捕食者,它们自行移动并有交互:
- 最初,U和V随机分布在一个域上;
- 在每个时间步,它们逐渐扩散到邻近空间;
- 当U和V相遇时,一部分U被V吞噬。因此,V的浓度增加;
- 为了避免U被V根除,我们在每个时间步添加一定百分比 (f) 的U并删除一定百分比 (k) 的V。
上面这个过程被概述为“反应-扩散方程”:
![](https://p0.ssl.img.360kuai.com/t01a6e79e099eafb7c4.jpg)
其中有四个关键参数:Du(U的扩散速度),Dv(V的扩散速度),f(feed的缩写,控制U的加入)和k(kill的缩写,控制V的去除)。
如果Taichi中实现这个方程,首先创建网格来表示域,用vec2表示每个网格中U, V的浓度值。
拉普拉斯算子数值的计算需要访问相邻网格。为了避免在同一循环中更新和读取数据,我们应该创建两个形状相同的网格W×H×2。
每次从一个网格访问数据时,我们将更新的数据写入另一个网格,然后切换下一个网格。那么数据结构设计就是这样:
![](https://p0.ssl.img.360kuai.com/t0120a647a3f436ce6b.jpg)
一开始,我们将U在网格中的浓度设置为 1,并将V放置在50个随机选择的位置:
![](https://p0.ssl.img.360kuai.com/t01758422991b7876fd.jpg)
那么实际计算就可以用不到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倍
贾店寒3350关于矩阵最大特征值与特征向量的计算矩阵A=( 1 1/2 4 3 32 1 7 5 51/4 1/7 1 1/2 1/31/3 1/5 2 1 1 1/3 1/5 3 1 1)求出最大特征值与特征向量,最好带过程,还... -
冶常邹18471345556 ______[答案] 我用mceAHP软件帮你算的,最大特征根是5.0717,CR=0.0160,CI=0.0179,RI=1.12,权重分别为{0.2636,0.4773,0.0531,0.0988,0.1072}
贾店寒335013.用与非门设计四变量的多数表决电路.当输入变量A、B、C、D有3个或3个以上为1时输出为1,输入为其它状我要实训报告 -
冶常邹18471345556 ______[答案] 要“实训报告”?! 这里是帮助不懂的人解决困难的,不是帮人做事的.楼主的实训报告都请人写的话,那书都请人读算了,那毕业证也请人领了哈.
贾店寒3350同学用计算器求30个数据的平均数时错将其中的一个数据108输入为18 由此求出的平均数与实际平均数的差为多 -
冶常邹18471345556 ______[答案] 少了108/30-18/30=3
贾店寒3350斐波那契数列:1、1、2、3、5、8、13、21、34、55、89、144、233…… 求输出小于1000的数列之和要是用C#直接弄出来,我就不用改了.初学我 -
冶常邹18471345556 ______[答案] public class Fibonacci { \x05public static int abc(int number){ \x05 \x05\x05if(number
贾店寒3350一个液压泵驱动两个串联液压缸工作,缸直径90mm活塞杆直径60mm,作用在两活塞杆上的负载均为10N,泵输出流量为25L/Min,不计损失,求油泵的输出... -
冶常邹18471345556 ______[答案] F=PS 100000N=P*3.14*90*90/4 因为串连的,所以再乘2 P=32MPA 25L*=3.14*90*90/4*S S=393MM/MIN
贾店寒3350已知MOD函数是一个求余函数,其格式为MOD(n,m),其结果为n除以m的余数,例如MOD(7,3)=1,如图是一个算法的程序框图,当输入的n值为15时,输出... -
冶常邹18471345556 ______[选项] A. 4 B. 5 C. 6 D. 7
贾店寒3350用python输入一个十进制数,输出其二进制串,八进制串,十六进制串 -
冶常邹18471345556 ______ #!/usr/bin/env python # -*- coding: utf-8 -*- # 2/10/16 base trans. wrote by srcdog on 20th, April, 2009 # ld elements in base 2, 10, 16. import os,sys # global definition # base = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F] base = [str(x) for x in range(10...
贾店寒3350怎么用python做一个输出10个文字排列的文本文件 -
冶常邹18471345556 ______ #coding =utf-8 reader = open('test.txt').readlines() n=0 for len in reader: writer=open(str(reader.index(len)+1)+'.txt','w') if (len.find('\n')>0): for n in range(0,10): writer.write(len[:-1]+reader[n]) else: for n in range(0,10): writer.write(len+reader[n]) writer.close() 这个基本能满足你要的功能,你把输入和输出的文件名改一下就行了
贾店寒3350输入一个十进制数,输出一个二进制串,怎么用Python编程??? -
冶常邹18471345556 ______ python3.x 及 python2.x均可运行: 1 2 n =int(input()) print(bin(n)[2:])
贾店寒3350如何用Python输出一个杨辉三角 -
冶常邹18471345556 ______ 以下代码运行通过: def yanghui(): b = [1] while True: yield b b = [1] + [b[i] + b[i + 1] for i in range(len(b) - 1)] + [1] n = 0 for t in yanghui(): print(t) n += 1 if n == 10: break运行效果: