This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2015年12月30日 20:05 by serhiy.storchaka, last changed 2022年04月11日 14:58 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| namedtuple_intern_field_names.patch | serhiy.storchaka, 2015年12月30日 20:05 | review | ||
| show_all_fieldnames_interned.py | rhettinger, 2015年12月31日 01:03 | |||
| alternate_namedtuple_intern.patch | rhettinger, 2015年12月31日 05:13 | Alternate patch (post-exec) | review | |
| show_all_fieldnames_interned2.py | rhettinger, 2015年12月31日 05:14 | Show that _fields are unaffected by the first patch | ||
| Messages (9) | |||
|---|---|---|---|
| msg257238 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2015年12月30日 20:05 | |
If intern field names in namedtuple, this will speed up the access to them, because names could be compared just by identity in dict lookup. This can also make pickles containing namedtuples more compact. |
|||
| msg257244 - (view) | Author: Raymond Hettinger (rhettinger) * (Python committer) | Date: 2015年12月31日 00:32 | |
Doesn't interning happen already as a byproduct of the exec? |
|||
| msg257246 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2015年12月31日 03:00 | |
Indeed, keys of __dict__ are interned. But elements of _fields are not.
>>> A = namedtuple('A', 'abc123 def456')
>>> sorted(A.__dict__)[-1] == A._fields[-1]
True
>>> sorted(A.__dict__)[-1] is A._fields[-1]
False
|
|||
| msg257247 - (view) | Author: Raymond Hettinger (rhettinger) * (Python committer) | Date: 2015年12月31日 05:13 | |
I don't see how the proposed patch would affect the result. ISTM that the interning would have to happen after the template substitution and exec. See the attached alternate patch. That said, I'm not too concerned with the contents of _fields not being interned. It isn't the performance sensitive part of the code. |
|||
| msg257258 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2015年12月31日 17:12 | |
Now, after you pointed out that the keys in the dictionary already interned, I'm not sure anymore that it is needed to intern the _fields items. I'm wondering, why short identifier-like string literals in compiled _fields are not interned? |
|||
| msg257285 - (view) | Author: Raymond Hettinger (rhettinger) * (Python committer) | Date: 2016年01月01日 10:47 | |
The benefits are tiny, but if the one line patch looks good, we might as well intern the _fields and save a few bytes. |
|||
| msg257286 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2016年01月01日 12:23 | |
Interesting, short string literals usually are interned, but they are not interned in tuple literal.
>>> namespace = {}
>>> exec('a = ["abc123"]\ndef abc123(): pass', namespace)
>>> namespace['abc123'].__name__ is namespace['a'][0]
True
>>> exec('a = ("abc123",)\ndef abc123(): pass', namespace)
>>> namespace['abc123'].__name__ is namespace['a'][0]
False
>>> namespace['abc123'].__name__ == namespace['a'][0]
True
I think it would be better to change the compiler to always intern short string literals. And patching namedtuple will be not needed.
|
|||
| msg264235 - (view) | Author: Raymond Hettinger (rhettinger) * (Python committer) | Date: 2016年04月26日 08:30 | |
> I think it would be better to change the compiler to always > intern short string literals. And patching namedtuple will > be not needed. Can we close this entry? If you do patch the compiler, a separate tracker item can be opened. |
|||
| msg264238 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2016年04月26日 08:51 | |
I already opened separate issue26148. Since I sure this is the correct way, I'm closing this issue. I'll reopen it in case of issue26148 will be rejected. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:58:25 | admin | set | github: 70169 |
| 2016年04月26日 08:51:57 | serhiy.storchaka | set | status: open -> closed resolution: duplicate stage: patch review -> resolved |
| 2016年04月26日 08:51:12 | serhiy.storchaka | set | superseder: String literals are not interned if in a tuple messages: + msg264238 |
| 2016年04月26日 08:30:06 | rhettinger | set | assignee: rhettinger -> serhiy.storchaka messages: + msg264235 |
| 2016年01月01日 12:23:49 | serhiy.storchaka | set | nosy:
+ brett.cannon, georg.brandl, ncoghlan, benjamin.peterson, yselivanov messages: + msg257286 |
| 2016年01月01日 10:47:00 | rhettinger | set | messages: + msg257285 |
| 2015年12月31日 17:12:28 | serhiy.storchaka | set | messages: + msg257258 |
| 2015年12月31日 05:14:47 | rhettinger | set | files: + show_all_fieldnames_interned2.py |
| 2015年12月31日 05:13:24 | rhettinger | set | files:
+ alternate_namedtuple_intern.patch messages: + msg257247 |
| 2015年12月31日 03:00:08 | serhiy.storchaka | set | messages: + msg257246 |
| 2015年12月31日 01:03:50 | rhettinger | set | files: + show_all_fieldnames_interned.py |
| 2015年12月31日 00:32:51 | rhettinger | set | messages: + msg257244 |
| 2015年12月30日 20:05:39 | serhiy.storchaka | create | |