cpython

5个有趣的Python小知识,结果令人意外

谁说我不能喝 提交于 2020-04-12 18:37:51
1 字符串驻留 如果上面例子返回True,但是下面例子为什么是False: 这与Cpython 编译优化相关,行为称为字符串驻留,但驻留的字符串中只包含字母,数字或下划线。 2 相同值的不可变对象 这是因为具有相同值的不可变对象在Python中始终具有相同的哈希值 由于存在哈希冲突,不同值的对象也可能具有相同的哈希值。 3 对象销毁顺序 创建一个类SE: 创建两个SE实例,使用is判断: 创建两个SE实例,使用id判断: 调用id函数, Python 创建一个 SE 类的实例,并使用id函数获得内存地址后,销毁内存丢弃这个对象。 当连续两次进行此操作, Python会将相同的内存地址分配给第二个对象,所以两个对象的id值是相同的。 但是is行为却与之不同,通过打印顺序就可以看到。 4 充分认识for   为什么不是执行一次就退出? 按照for在Python中的工作方式, i = 10 并不会影响循环。range(5)生成的下一个元素就被解包,并赋值给目标列表的变量i. 5 认识执行时机 g为生成器,list(g)后返回[1,3,5],因为每个元素肯定至少都出现一次。所以这个结果这不足为奇。但是,请看下例: 请问,list(g)等于多少?这不是和上面那个例子结果一样吗,结果也是[1,3,5],但是: 这有些不可思议 原因在于:生成器表达式中, in 子句在声明时执行,

Modify *existing* variable in `locals()` or `frame.f_locals`

时光总嘲笑我的痴心妄想 提交于 2020-04-10 08:21:06
问题 I have found some vaguely related questions to this question, but not any clean and specific solution for CPython. And I assume that a "valid" solution is interpreter specific. First the things I think I understand: locals() gives a non-modifiable dictionary. A function may (and indeed does) use some kind of optimization to access its local variables frame.f_locals gives a locals() like dictionary, but less prone to hackish things through exec . Or at least I have been less able to do hackish

【Python3 爬虫】U29_GIL全局解释器锁

自古美人都是妖i 提交于 2020-04-09 01:14:18
Python自带的解释器是CPtyhon。CPtyhon解释器的多线程实际上一个假的多线程(在多核CPU中,只能利用一核,不能利用多核)。同一时刻只有一个线程在执行,为了保证同一时刻只有一个下线程在执行,在CPython解释器中有一个东西叫做GIL,叫做全局解释器锁。这个解释器锁是有必要的,因为CPython解释器的内存管理不是线程安全的。当然,处理CPython,还有其他解释器: 1.Jython,用Java实现的解释器。不存在GIL锁。 2.IronPython:用.net实现的Python解释器。不存在GIL锁。 3.PyPy:用Python实现的Python解释器。存在GIL锁。 GIL虽然是一个假的多线程。但是在处理一些IO操作上(例如写文件和网络请求),可以很大程度的提高效率。在IO密集型操作上建议使用多线程,但是在一些CPU密集型操作上不建议使用多线程,而建议使用多进程。 来源: oschina 链接: https://my.oschina.net/u/4300877/blog/3225205

What is co_names?

北城以北 提交于 2020-04-08 08:42:40
问题 The description for co_names in the inspect module reads: tuple of names of local variables However in practice it appears that co_names is a tuple of global variable names while co_varnames is a tuple of local variable names (and argument names). For example: a = 1 def f(b): c = a + b print(f.__code__.co_varnames) # prints ('b', 'c') print(f.__code__.co_names) # prints ('a',) Furthermore in the docs for the dis module many instruction descriptions imply that co_names contains names of global

What causes [*a] to overallocate?

核能气质少年 提交于 2020-03-12 07:19:46
问题 Apparently list(a) doesn't overallocate, [x for x in a] overallocates at some points, and [*a] overallocates all the time ? Here are sizes n from 0 to 12 and the resulting sizes in bytes for the three methods: 0 56 56 56 1 64 88 88 2 72 88 96 3 80 88 104 4 88 88 112 5 96 120 120 6 104 120 128 7 112 120 136 8 120 120 152 9 128 184 184 10 136 184 192 11 144 184 200 12 152 184 208 Computed like this, reproducable at repl.it, using Python 3. 8 : from sys import getsizeof for n in range(13): a =

What causes [*a] to overallocate?

帅比萌擦擦* 提交于 2020-03-12 07:19:21
问题 Apparently list(a) doesn't overallocate, [x for x in a] overallocates at some points, and [*a] overallocates all the time ? Here are sizes n from 0 to 12 and the resulting sizes in bytes for the three methods: 0 56 56 56 1 64 88 88 2 72 88 96 3 80 88 104 4 88 88 112 5 96 120 120 6 104 120 128 7 112 120 136 8 120 120 152 9 128 184 184 10 136 184 192 11 144 184 200 12 152 184 208 Computed like this, reproducable at repl.it, using Python 3. 8 : from sys import getsizeof for n in range(13): a =

sum() 函数性能堪忧,列表降维有何良方?

独自空忆成欢 提交于 2020-03-10 03:26:41
本文原创并首发于公众号【 Python猫 】,未经授权,请勿转载。 原文地址: https://mp.weixin.qq.com/s/mK1nav2vKykZaKw_TY-rtw Python 的内置函数 sum() 可以接收两个参数,当第一个参数是二维列表,第二个参数是一维列表的时候,它可以实现列表降维的效果。 在上一篇《 如何给列表降维?sum()函数的妙用 》中,我们介绍了这个用法,还对 sum() 函数做了扩展的学习。 那篇文章发布后,猫哥收到了一些很有价值的反馈,不仅在知识面上获得了扩充,在思维能力上也得到了一些启发,因此,我决定再写一篇文章,继续跟大家聊聊 sum() 函数以及列表降维。若你读后有所启发,欢迎留言与我交流。 有些同学表示,没想到 sum() 函数竟然可以这么用,涨见识了!猫哥最初在交流群里看到这种用法时,也有同样的想法。整理成文章后,能得到别人的认可,我非常开心。 学到新东西,进行分享,最后令读者也有所获,这鼓舞了我——应该每日精进,并把所学分享出去。 也有的同学早已知道 sum() 的这个用法,还指出它的性能并不好,不建议使用。这是我不曾考虑到的问题,但又不得不认真对待。 是的,sum() 函数做列表降维有奇效,但它性能堪忧,并不是最好的选择。 因此,本文想继续探讨的话题是: (1)sum() 函数的性能到底差多少,为什么会差?(2)既然 sum()

在Python中更改字符串中的一个字符

你说的曾经没有我的故事 提交于 2020-03-07 12:58:21
Python中替换字符串中字符的最简单方法是什么? 例如: text = "abcdefg"; text[1] = "Z"; ^ #1楼 Python字符串是不可变的,您可以通过复制来更改它们。 做您想做的最简单的方法可能就是。 text = "Z" + text[1:] text [1:]从位置1到结尾返回文本字符串,位置从0开始计数,因此'1'是第二个字符。 编辑:您可以对字符串的任何部分使用相同的字符串切片技术 text = text[:1] + "Z" + text[2:] 或者,如果该字母仅出现一次,则可以使用下面建议的搜索和替换技术 #2楼 new = text[:1] + 'Z' + text[2:] #3楼 不要修改字符串。 与他们一起工作; 仅在需要时才将它们转换为字符串。 >>> s = list("Hello zorld") >>> s ['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd'] >>> s[6] = 'W' >>> s ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'] >>> "".join(s) 'Hello World' Python字符串是不可变的(即无法修改)。 造成这种情况的原因 很多 。 除非您别无选择,否则请使用列表

【原创】更新vcpkg中的python版本为当前最新版本python3.8.x,并编译boost.python为3.8.x

ⅰ亾dé卋堺 提交于 2020-02-27 15:38:04
vcpkg中当前最新的boost为1.7.2 ,python3为3.7.3,升级到最新的python3.8.1版本步骤如下: 1、先编译python3.8.1的VCPKG库, 修改 ports\python3\ portfile.cmake中的python版本号为 set (PYTHON_VERSION_MAJOR 3) set(PYTHON_VERSION_MINOR 8) set(PYTHON_VERSION_PATCH 1) 2、下载最新版本的 python-cpython-v3.8.1.tar.gz文件到downloads目录中 3、修改scripts/cmake/vcpkg_download_distfile.cmake文件,目的是取消验证所下载的 python-cpython-v3.8.1.tar.gz文件是否与服务器上的一致,我们主要 把验证文件hash值的函数 function (test_hash FILE_PATH FILE_KIND CUSTOM_ERROR_ADVICE)取消,在该函数内第一行直接加入return()返回即可. 4、vcpkg install python3 即可安装上最新的python3.8.1为VCPKG的库。 5、接下来安装boost.python和我们当前的python3.8.1绑定,补上缺少的python头文件

是否在Python 3.6+中订购了字典?

做~自己de王妃 提交于 2020-02-27 12:16:33
与以前的版本不同,字典在Python 3.6中排序(至少在CPython实现下)。 这似乎是一个实质性的更改,但这只是 文档中 的一小段。 它被描述为CPython实现细节而不是语言功能,但这也意味着将来可能会成为标准。 在保留元素顺序的同时,新的字典实现如何比旧的实现更好? 以下是文档中的文字: dict() 现在使用 由PyPy开创 的“紧凑”表示形式。 与Python 3.5相比,新dict()的内存使用量减少了20%至25%。 PEP 468 (在函数中保留** kwarg的顺序。)由此实现。 此新实现的顺序保留方面被认为是实现细节,因此不应依赖(将来可能会更改,但是希望在更改语言规范之前,先在几个发行版中使用该新dict实现该语言,为所有当前和将来的Python实现强制要求保留顺序的语义;这还有助于保留与仍旧有效的随机迭代顺序的旧版本语言(例如Python 3.5)的向后兼容性。 (由INADA Naoki在 Issue 27350中提供 。该想法 最初由Raymond Hettinger提出 。) 2017年12月更新:Python 3.7 保证 dict 保留插入顺序 #1楼 以下是回答原始的第一个问题: 我应该在Python 3.6中使用 dict 还是 OrderedDict ? 我认为文档中的这句话实际上足以回答您的问题 此新实现的顺序保留方面被视为实现细节