首页 >>  正文

python递归输出斐波那契

来源:baiyundou.net   日期:2024-08-23

Hi!我是W3Cschool编程狮的小狮妹~

Python是一种非常流行的编程语言,它有很多优点,比如简洁、灵活、易学、丰富的库等。但是,Python也有一个很大的缺点,就是性能差、速度慢。这是不可否认的问题。很多人都拿Python和其他编程语言比较,比如Java、C++等,发现Python在运行速度上远远落后于它们。那么,Python性能到底怎么样呢?我们应该如何看待Python的性能问题呢?下面,小狮妹就来给大家分析一下。

Python为什么速度慢?

Python为什么速度慢?这和Python的设计特点有关。Python是一种动态类型的语言,也就是说,在运行时才会检查变量的类型,并根据类型进行相应的操作。这样虽然方便了编程者,但也增加了运行时的开销。

而Java、C++等语言都是静态类型的语言,也就是说,在编译时就会确定变量的类型,并生成相应的机器码。这样虽然增加了编程者的负担,但也提高了运行时的效率。

Python是一种解释型的语言,也就是说,在运行时才会把源代码转换成机器码,并执行。而Java、C++等语言都是编译型的语言,也就是说,在运行前就会把源代码编译成机器码,并保存在文件中。这样虽然增加了运行前的时间,但也减少了运行时的时间。

还有一个原因,就是Python有一个全局解释器锁(GIL),它限制了多线程的并发性能。GIL保证了同一时刻只有一个线程可以执行Python字节码,这样可以避免一些数据竞争和内存管理的问题。但是,这也意味着Python无法充分利用多核处理器的优势,而Java、C++等语言可以通过多线程来提高并发性能。

Python速度慢有多严重?

那么,Python速度慢有多严重呢?我们可以通过一个简单的例子来看看。如果分别用 Python、Java、C++实现一段Fibonacci代码(计算斐波那契数列),然后放在一起同时运行,然后对比运行时间,毫无疑问,Python是最慢的。

小狮妹在我的电脑上运行了这三段代码,得到了如下的结果:

语言

运行时间(秒)

Python

35.87

Java

0.66

C++

0.59

可以看到,Python的运行时间是Java的54倍,是C++的61倍。这是一个非常惊人的差距。如果我们把n的值增大,这个差距会更加明显。

Python速度慢有多重要?

那么,Python速度慢有多重要呢?我们应该因为Python速度慢而放弃使用它吗?当然不是。我们要知道,Python速度慢只是一个表象,而不是一个本质。我们不能只看到Python在运行速度上的劣势,而忽略了Python在其他方面的优势。

Python速度慢并不意味着Python效率低。效率是一个相对的概念,它不仅取决于运行速度,还取决于开发速度、维护成本、可扩展性等因素。如果把范围扩大到一项工作或者一项任务,就不一样了。

例如,要做一个矩阵运算、要读取Excel数据,用C++、Java可能需要实现一大串代码,而用Python可能只需要10行左右的代码就可以实现。从整个任务的实现效率来看,Python肯定是占优的。这也是为什么Python受欢迎的原因,对于从事AI、数据分析的同学来说,编码并不是核心的工作内容,他们主要面对的问题是能够快速迭代、快速验证算法的有效性,从这方面来说,Python是可以胜任的。换做C++,可能大部分时间都耗费在编码实现上了。

我们要明白,Python速度慢并不意味着Python无法提升性能。虽然改变不了Python作为一种动态语言在性能方面的限制,但是我们可以尽自己最大努力实现性能的最优。例如:

  • 养成良好的编码习惯,避免使用不必要的循环、递归、全局变量等。
  • 合理利用一些性能提升方法,比如LRU缓存、多进程、多线程、异步IO等。
  • 使用一些优化工具和库,比如Cython、Numba、PyPy等,它们可以把Python代码转换成更高效的代码。
  • 使用一些专业的库和框架,比如NumPy、Pandas、TensorFlow等,它们可以利用底层的C/C++代码和硬件加速来提高运算速度。

Python性能怎么看?

综上所述,我们可以得出一个结论:Python性能怎么看?答案是:看场景、看需求、看方法。

  • 看场景:不同的场景有不同的性能要求。如果你只是做一些简单的数据处理和分析,那么Python足够用了。如果你要做一些复杂的计算密集型的任务,比如机器学习、深度学习等,那么Python可能就不够了,你需要考虑其他的语言或者工具。
  • 看需求:不同的需求有不同的性能标准。如果你只是为了自己的兴趣或者学习,那么Python性能差一点也没关系。如果你要为了商业或者科研,那么Python性能就很重要了,你需要尽量优化你的代码和算法,或者寻找其他的解决方案。
  • 看方法:不同的方法有不同的性能效果。如果你只是用Python的基本语法和功能,那么Python性能可能就很差。如果你能够利用Python的一些高级特性和库,那么Python性能可能就会有很大的提升。

结语

总之,Python性能是一个复杂而多面的问题,我们不能一概而论,也不能盲目崇拜或者贬低。我们要根据自己的实际情况,选择合适的语言和方法,来实现我们的目标。

今天我们就聊到这里吧,小狮妹希望你能从这篇文章中得到一些启发和帮助~

如果你想学习Python,体验边学边练闯关式Python学习体验,小狮妹欢迎你扫描下方二维码,即刻下载编程狮App,免费阅读包含Python在内的1000+编程教程!

","gnid":"93f73dcc5bb813012","img_data":[{"flag":2,"img":[{"desc":"","height":"625","title":"","url":"https://p0.ssl.img.360kuai.com/t014e6df950b57f6284.jpg","width":"1000"},{"desc":"","height":"667","title":"","url":"https://p0.ssl.img.360kuai.com/t016a8b537c9ac0cf5d.jpg","width":"1000"},{"desc":"","height":"667","title":"","url":"https://p0.ssl.img.360kuai.com/t01254a1bc86329f63f.jpg","width":"1000"}]}],"original":0,"pat":"art_src_3,sexf,sex4,sexc,fts0,sts0","powerby":"hbase","pub_time":1692352320000,"pure":"","rawurl":"http://zm.news.so.com/d13aab0019921875843a32816a0bed3c","redirect":0,"rptid":"d1bd85894f6351e5","rss_ext":[],"s":"t","src":"W3Cschool","tag":[{"clk":"ktechnology_1:java","k":"java","u":""}],"title":"如何看待Python的性能?探寻性能与效率的平衡

宇德幸1402用递归法编写函数,求出斐波纳契数列的第15项的值 -
房岭受15096689896 ______ 你要解释什么? 斐波那契数列即 f(n) = f(n-1) + f(n-2)……你这个实现方式是个很典型的递归.咱们可以从最小的数开始. n=0, 那么这个函数就返回0, n=1, 返回1 n=2, 返回 f(1)+(f0) = 1 + 0 = 1 n=3,返回 f(2)+f(1) = (f(1)+f(0)) + f(1) = ... 类似这...

宇德幸1402python计算斐波纳西数列的第一个大于100的数 -
房岭受15096689896 ______ known = {0: 0, 1: 1} def fib2(n): if n in known: return known[n] res = fib2(n - 1) + fib2(n - 2) known[n] = res return res print fib2(12) i=0 while True: if fib2(i)>100: break i+=1 print i

宇德幸1402用递归算法计算斐波拉契级数数列中第n项的值,1、1、2、3、5、8、13、21、 -
房岭受15096689896 ______ case 1: return 1; case 2: return 1;case 1后面加个冒号和 return 1就行.

宇德幸1402python的递归,函数的输出是什么,为什么会这样 -
房岭受15096689896 ______ 我运行了一下,result的结果为[[1, 1], [1, 1], [1, 1], [1, 1]],你想的得到的结果是不是[[0, 0], [0, 1], [1, 0], [1, 1]] ?如果是,那么把代码改一改,原因是result里面4个arr是一个对象,要进行拷贝才能使result里面4个元素值不一样 import numpy as np def ...

宇德幸1402急需! 编程按照10个一行的格式输出10000以内的斐波那契数列,请写出完整的程序代码.(斐波那 -
房岭受15096689896 ______ var f:array[0..100] of longint; i,k:integer; begin f[0]:=1; f[1]:=1; i:=1; repeat inc(i); f[i]:=f[i-1]+f[i-2]; until f[i]>=10000; k:=i-1; for i:=0 to k do if i mod 10=9 then writeln(f[i]:7) else write(f[i]:7); end. 以上是pascal程序.

宇德幸1402如何用java打印斐波那车数列?
房岭受15096689896 ______ 使用递归就可以实现了,public static int Fibonacci(int num){ if(num==1 || num==2) return 1; return Fibonacci(num-2)+Fibonacci(num-1); } 其中参数num为你想要第几个位置的数值. 比如你要求第10位的数,直接用 int n=Fibonacci(10)就行了 如果要打印多个数列,只要加一个循环,然后在循环中调用Fibonacci(n)方法就可以了

宇德幸1402用递归求斐波那契第50项的值 -
房岭受15096689896 ______ class Program { public static void Main() { System.Console.WriteLine(Fibonacci(50)); } static long Fibonacci(int n) { return CalcFibonacci(n, new long[n + 1]); } static long CalcFibonacci(int n, long[] cache) { if (n == 1 || n == 2) return 1L; if (...

宇德幸1402python中的filter函数怎么用 -
房岭受15096689896 ______ python filter内建函数 filter函数是python内建函数,可以操作任何可迭代类型,如list,tuple,string.filter需要带上一个函数function和一个可迭代序列作为参数.filter()将调用该function作用于每一个可迭代序列的元素,并返回一个由该function验证...

宇德幸1402递归的弊端是什么?能不能说出斐波拉戚公式用递归实现的缺点? -
房岭受15096689896 ______ 虽然语句看起来比较简单,但是执行起来却很复杂, 因为递归操作其实是进行反复的压栈弹栈操作.这样就需要很大的存储空间,消耗很大的内存.实现效率也是很低的. 栈的操作原理就是先进先出,后进后出.只要栈里面有数据程序就没有中止,斐波拉戚公式在实现上用的就是这个原理,程序一直执行,一直到又一次调用自身,程序有会从头开始执行,这个时候其实在栈中压栈的数据并没有弹栈,因为程序没有结束就又进行下一次的压栈,所以这样一直执行,知道条件不满足,就开始弹出栈中的数据并根据符号栈弹出的符号进行计算对应的值.一直到程序结束位置.

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