本文目录一览:
- 1、python3怎么导入re模块
- 2、python3安装遇到的坑
- 3、Python性能提升神器!lru_cache的介绍和讲解
- 4、你可能没有在Python3中使用但却应该使用的东西
- 5、python3_原生 LRU 缓存
python3怎么导入re模块
Python除了 str 对象自带的一些方法外,re文字处理能力也很强大。
正则表达式元字符说明
[python正则表达式]
导入和查看正则表达式模块
import re
查看正则表达式模块方法
dir(re)
[‘DEBUG’, ‘DOTALL’, ‘I’, ‘IGNORECASE’, ‘L’, ‘LOCALE’, ‘M’, ‘MULTILINE’, ‘S’, ‘Scanner’, ‘T’,’TEMPLATE’, ‘U’, ‘UNICODE’, ‘VERBOSE’, ‘X’, ‘_MAXCACHE’, ‘all‘, ‘builtins‘, ‘doc‘,’file‘, ‘name‘, ‘package‘, ‘version‘, ‘_alphanum’, ‘_cache’, ‘_cache_repl’,’_compile’, ‘_compile_repl’, ‘_expand’, ‘_pattern_type’, ‘_pickle’, ‘_subx’, ‘compile’,’copy_reg’, ‘error’, ‘escape’, ‘findall’, ‘finditer’, ‘match’, ‘purge’, ‘search’, ‘split’,’sre_compile’, ‘sre_parse’, ‘sub’, ‘subn’, ‘sys’, ‘template’]
提示:
1. 当我们不会用模块方法的时候用help
2. py2中pattern中的字符串要和string的编码一致,不然会找不到,这个经常出现。
python3安装遇到的坑
[root@bogon bin]# python3
python3: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory
解决方法:
[root@bogon bin]# echo "/usr/lib" /etc/ld.so.conf.d/python3.6.conf
[root@bogon bin]# ldconfig
[root@bogon bin]# ldd /usr/bin/python3
linux-vdso.so.1 = (0x00007ffdcdd46000)
libpython3.6m.so.1.0 = /usr/lib/libpython3.6m.so.1.0 (0x00007fddfe4f1000) 这里,之前是显示not found
libpthread.so.0 = /lib64/libpthread.so.0 (0x00007fddfe2d5000)
libdl.so.2 = /lib64/libdl.so.2 (0x00007fddfe0d0000)
libutil.so.1 = /lib64/libutil.so.1 (0x00007fddfdecd000)
libm.so.6 = /lib64/libm.so.6 (0x00007fddfdbcb000)
libc.so.6 = /lib64/libc.so.6 (0x00007fddfd807000)
/lib64/ld-linux-x86-64.so.2 (0x000055d9c1cf5000)
[root@bogon bin]# python3
Python 3.6.4 (default, Jan 3 2018, 10:00:47)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
关于ldconfig:(以下来自网络)
ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到
2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到
比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程序运行时被找到。
3. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。
4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。
5. 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。
Python性能提升神器!lru_cache的介绍和讲解
我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存。 Python的缓存(lru_cache)是一种装饰在被执行的函数上,将其执行的结果缓存起来,当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函数的一种缓存装饰器。
那它和redis的区别在哪?有什么优势?怎么使用? 下面为你讲解
1.现在我们先不使用缓存来写一个求两数之和的函数,并调用执行它两次:
执行结果
可以看到 test 被执行了两次,现在我们加上缓存再进行执行:
执行结果
可以看到 test 函数只被执行了一次,第二次的调用直接输出了结果,使用了缓存起来的值。
2.当我们使用递归求斐波拉契数列 (斐波那契数列指的是这样一个数列:0,1,1,2,3,5,8,它从第3项开始,每一项都等于前两项之和) 的时候,缓存对性能的提升就尤其明显了:
不使用缓存求第40项的斐波拉契数列
执行时间
使用缓存求第40项的斐波拉契数列:
执行时间
两个差距是非常明显的,因为不使用缓存时,相当于要重复执行了很多的函数,而使用了 lru_cache 则把之前执行的函数结果已经缓存了起来,就不需要再次执行了。
查看lru_cache源码会发现它可以传递两个参数: maxsize 、 typed :
代表被lru_cache装饰的方法最大可缓存的结果数量 (被装饰方法传参不同一样,则结果不一样;如果传参一样则为同一个结果) , 如果不指定传参则默认值为128,表示最多缓存128个返回结果,当达到了128个时,有新的结果要保存时,则会删除最旧的那个结果。如果maxsize传入为None则表示可以缓存无限个结果;
默认为false,代表不区分数据类型,如果设置为True,则会区分传参类型进行缓存,官方是这样描述的:
但在python3.9.8版本下进行测试,typed为false时,按照官方的测试方法测试得到的还是会被当成不同的结果处理,这个时候typed为false还是为true都会区别缓存,这与官方文档的描述存在差异:
执行结果
但如果是多参数的情况下,则会被当成一个结果:
执行结果
这个时候设置typed为true时,则会区别缓存:
执行结果
当传参个数大于1时,才符合官方的说法,不清楚是不是官方举例有误
当传递的参数是dict、list等的可变参数时,lru_cache是不支持的,会报错:
报错结果
缓存 缓存位置 是否支持可变参数 是否支持分布式 是否支持过期时间设置 支持的数据结构 需单独安装 redis 缓存在redis管理的内存中 是 是 是 支持5种数据结构 是 lru_cache 缓存在应用进程的内存中,应用被关闭则被清空 否 否 否 字典(参数为:key,结果为:value) 否
经过上面的分析,lru_cache 功能相对于redis来说要简单许多,但使用起来更加方便,适用于小型的单体应用。如果涉及的缓存的数据种类比较多并且想更好的管理缓存、或者需要缓存数据有过期时间(类似登录验证的token)等,使用redis是优于lru_cache的。
你可能没有在Python3中使用但却应该使用的东西
由于Python EOL的发布,许多人开始将他们的Python版本从2切换到3。不幸的是,我发现大多数Python3看起来仍然像Python2,但是要加括号(尽管在我之前的文章《使用Python进行web抓取介绍》中的代码示例也是这样)。下面,我将展示一些令人兴奋的特性示例,你只能在Python3中使用它们,希望它可以让你使用Python解决问题变得更容易。
所有示例都是在Python 3.7中编写的,每个特性都包含该特性所需的最低Python版本。
在任何编程语言中,没有字符串是很难做任何事情的,为了保持理智,你希望有一种结构化的方法来处理字符串。大多数使用Python的人更喜欢使用format方法。
除了format,Python 3还提供了一种通过f-strings进行字符串插值的灵活方法。和上面一样使用f-strings的代码是这样的:
f-strings非常棒,但是有些字符串(比如文件路径)有自己的库,这使得它们的操作更加容易。Python 3提供了pathlib作为一个处理文件路径的方便抽象。如果你不确定为什么你应该使用pathlib,试着阅读这篇优秀的文章——《为什么你应该使用pathlib》——Trey Hunner。
静态和动态类型是软件工程中一个热门的话题,几乎每个人都对此有自己的看法。我将让读者决定何时应该编写类型,但我认为你至少应该知道Python 3支持类型提示。
Python 3提供了一种通过Enum类来编写枚举的简单方法。枚举是封装常量列表的一种方便的方法,因此它们不会在没有太多结构的情况下随机分布在你的代码中。
枚举是一组符号名称(成员),它们绑定到惟一的常量值。在枚举中,可以通过标识对成员进行比较,并且枚举本身也可以被遍历。
缓存存在于我们今天使用的几乎所有水平的软件和硬件中。Python 3通过将LRU(最近最少使用的)缓存公开为一个名为lru_cache的装饰器,使得使用它们变得非常简单。
下面是一个简单的Fibonacci函数,我们知道它将从缓存中受益,因为它通过递归多次执行相同的任务。
现在我们可以使用lru_cache对其进行优化(这种优化技术称为memoization(记忆化))。执行时间从几秒降到几纳秒。
请查看代码(文档 )。
Python 3引入了数据类,这些数据类并没有太多限制,可以使用它们来减少样板代码,因为装饰器会自动生成特殊的方法,比如__init__() 和__repr()__。根据官方建议,它们被描述为“具有默认值的可变命名元组”。
使用数据类的Armor的相同实现。
结构化Python代码的一种方法是在包中(带有一个__init__.py文件的文件夹)。下面的示例是由官方Python文档提供的。
在Python2中,上面的每个文件夹都必须有一个__init__.py文件,它会将该文件夹转换为一个Python包。在Python3中,随着隐式命名空间包的引入,这些文件就不再需要了。
编者注:正如一些人所说,这并不像我在本节中指出的那样简单,从官方的PEP 420规范来看——__init__.py对于普通包仍然是必需的,将它从文件夹结构中删除将会把文件夹变成一个带有附加限制的本地命名空间包,关于本机命名空间包的官方文档对此展示了一个很好的例子,以及命名所有的限制。
就像互联网上几乎所有的列表一样,本列表并不完整。我希望这篇文章至少向你展示了一个你以前并不知道的Python 3功能,它将帮助你编写更简洁、更直观的代码。一如既往,所有的代码都可以在GitHub上找到。
( )
python3_原生 LRU 缓存
原生 LRU 缓存(最低 Python 版本为 3.2)
目前,几乎所有层面上的软件和硬件中都需要缓存。Python 3 将 LRU(最近最少使用算法)缓存作为一个名为「lru_cache」的装饰器,使得对缓存的使用非常简单。
下面是一个简单的斐波那契函数,我们知道使用缓存将有助于该函数的计算,因为它会通过递归多次执行相同的工作。
现在,我们可以使用「lru_cache」来优化它(这种优化技术被称为「memoization」)。通过这种优化,我们将执行时间从几十秒降低到了几秒。