当前位置: 首页 > 后端技术 > Python

为什么Python内置函数不是万能的?_0

时间:2023-03-26 16:19:24 Python

本文出自《WhyPython》系列,请查看所有文章分析它们运行速度的差异。在分析为什么list()比较慢的时候,文章说需要经过namelookup和functioncall两步,所以这就引出了一个新的问题:list()不是内置类型吗,为什么不能't直接调用创建列表的逻辑呢?也就是说,为什么解释器必须通过名称查找才能“知道”该做什么?其实原因很简单:内置函数/类型的名称不是关键字,它们只是解释器内置的一个方便的函数,方便开发者开箱即用。PS:内置函数built-infunction和内置类型built-intype很相似,但是list()其实是内置类型而不是内置函数。我已经对这两个令人困惑的概念做了一些研究,请查看这篇文章。为了便于理解和表达,以下统称为内置函数。1、内置函数的搜索优先级最低。内置函数的名称不是关键字,可以重新赋值。例如下面的例子:#正常调用内置函数list(range(3))#结果:[0,1,2]#定义任意函数并赋值给listdeftest(n):print("HelloWorld!")list=testlist(range(3))#结果:HelloWorld!在本例中,我们将自定义测试赋值给list,程序并没有报错。这个例子甚至可以改成直接定义一个同名的新函数,即“deflist():...”。这表明list不是Python限定的关键字/保留字。查看官方文档,可以发现Python3.9有35个关键字,具体如下:如果我们将上面例子中的测试赋值给任何一个关键字,比如“pass=test”,就会报错:SyntaxError:无效的语法。从这里我们可以看出,从这个角度来看,内置函数并不是万能的:它们的名字不像关键字那么稳定。对象很容易被拦截!因为解释器查找名字的顺序是“局部作用域->全局作用域->内置作用域”,所以内置函数的优先级实际上是最低的。对于新手来说,可能会出现意想不到的情况(内置函数有69个,很难全部记住)。那么,为什么Python不让所有内置函数的名称都成为不可重复的关键字呢?一方面是想控制关键词的数量,另一方面可能是想给用户留更多的自由。内置函数只是解释器的推荐实现,开发者可以根据需要实现与内置函数同名的函数。然而,这种情况很少见,开发人员通常会定义不同名称的函数。以Python标准库为例,ast模块有literal_eval()函数(对比eval()内置函数),pprint模块有pprint()函数(对比print()内置函数),并且itertools模块有zip_longest()函数(与zip()内置函数相比)...2.内置函数可能不是最快的,因为内置函数的名字是不是保留关键字。而且它在名称查找的最后顺序中,因此内置可能不是最快的。上一篇文章展示了[]比list()快2~3倍的事实。其实这也可以扩展到内置类型如str()、tuple()、set()、dict()等,都是字面量的使用,比内置类型的使用稍微快一些。对于这些内置类型,当我们调用xxx()时,可以简单理解为实例化类。在面向对象的语言中,类在使用之前被实例化是很正常的。然而,这种方法有时很麻烦。为了方便使用,Python为一些常用的内置类型提供了字面量表示,即""、[]、()、{}等,表示字符串、列表、元组、字典等数据类型。文档来源:https://docs.python.org/3/reference/lexical_analysis.html#delimiters一般来说,所有的编程语言都必须有一些字面量的表示,但基本仅限于数值类型、字符串、和布尔类型和null等基本类型。Python还为几种数据结构类型添加了文字,因此它们更加方便,这也解释了为什么内置函数可能不是最快的。一般来说,同样完整的函数,内置函数总是比我们自定义的函数快,因为解释器可以做一些底层的优化,比如len(),内置函数肯定比自定义的快x.len()函数。有人据此形成了“内置函数总是更快”的误解。与用户自定义函数相比,解释器内置函数接近后门;而文字表示是比内置函数更快的后门。也就是说,当文字符号可用时,一些内置函数/内置类型并不是最快的!总结Python本身确实不是万能的,它的任何语法组件(内置函数/类型)更不是万能的。但是,一般我们认为内置函数/类型总是“高人一等”,得到很多特殊待遇,似乎“无所不能”。本文将“list()会输给[]”的话题进行分解,从两个角度揭示了内置函数其实存在一些不足:内置函数的名字不是关键字,以及内置作用域在namelookup中处于最低优先级,因此一些内置函数/类型在调用时执行速度明显慢于其文字对应物。本文对之前的“WhyPython”这个话题进行了扩展讨论。一方面丰富了之前的内容。另一方面也帮助大家理解Python的几个基本概念及其实现。如果喜欢本文,请点赞支持!另外,我也写过20+篇类似话题的文章,请关注Python猫查看,在Github上给我点star~~--->>>最后是福利时刻:我放了100篇两年写成多篇优质文章,汇集成700多页的《优雅的Python》电子书。我真诚地推荐它!!请关注Python猫微信,回复“优雅”即可获取~~