Python
�Ƕ��Python-dev(2018-06)
�Хå��ʥ�С�:
- 2018: 1�� | 4��
- 2017: 1�� | 2�� | 3�� | 4�� | 5�� | 6�� | 8�� | 9�� | 12��
Python 3.7
���ܻ��֤�6/28�� Python 3.7 ����꡼������ޤ����� ���פ˶���ߤ�2���ç¤ï¿½Ü¤ï¿½ï¿½Ñ¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
- Unicode 11 �б�
- AST���ѹ��� revert
Unicode 11 �ϥǡ����ι��������ʤΤǴ��������ʤ�����1.5ǯ���3.8�ޤ��ˤϤ������ʤ��Ȥ������Ȥ�Go�����󤬽Фޤ�����
AST �ϡ��ͤ��濴�ǹԤä�AST�ʳ��Ǥ�������߹��ߤν����Ȥ��ơ� docstring �Ȥ����Ǥʤ�ʸ����ζ��̤�AST�ʳ��ǤĤ��䤹��������ѹ����Ƥ��ޤ�����
�����ѹ��ˤ�ꤤ���Ĥ��Υ饤�֥������꤬��𤵤�Ƥ����ΤǤ�����AST �Ϥ�Ȥ�ȸ����ߴ������ݾڤ��Ƥ��ʤ�����ȥ饤�֥��¦�Ǥ��н褬����Ƥ��ޤ�������������RC�ե����������äƤ��� IPython ��¾�Ȱۤʤ�������򤷤Ƥ��ơ�����AST�˴ؤ���API�� IPython �Υˡ������������Ƥ��餺���곰���н褬ɬ�פˤʤäƤ������Ȥ��顢��ö�����ᤷ�Ƥޤ�API����ͤ�ľ�����Ȥ������Ȥˤʤ�ޤ�����
������󤳤�AST���ѹ��򸵤�������߹��ߤ�����Ƥ����Τǡ�������߹��߸�� docstring ��ʸ��������ζ��̤��Ĥ��ʤ��ʤ�ʤ��褦�� Python ¦�˥ϥå���ɬ�פˤʤ�ΤǤ������ͤ�������ȤǤ��ʤ��������� Serhiy ����äƤ���ޤ����� https://github.com/python/cpython/pull/7121/files/8ee9227599583c460ff8faf9c1ab1670559a1224#r191080934
Compact GC Header
Python 3.8 �˸������ç¤ï¿½ï¿½Î²ï¿½ï¿½ï¿½ï¿½ï¿½1�Ĥ�ˡ�2000ǯ�����ѹ�����Ƥʤ��۴Ļ���GC�ѤΥ��ꥪ���С��إåɤκ︺��ĩ�路�Ƥ��ޤ���
���礦�� 6/25 �ˡ����٥�ץ�����ߥ󥰤�����ˤʤ뤳�Ȥ�¿�� Turing Complete FM �Υꥹ�ʡ������ޤ� �ߡ��ȥ��åץ��٥��� �����ä��Τǡ�������ȯɽ���Ƥ��ޤ�����
����Ū�ˤϤĤ��Τ褦����ά�ǡ�GC�ѥإå��Υ�������̤�ݥ���3��ʬ����2��ʬ�˺︺���Ƥ��ޤ���
- ��������󥯥ꥹ�Ȥε�������󥯤򡢰��Ū���٤���GC�Ѥλ��ȥ�����Ȥ˻Ȥ���ɬ�פˤʤ������᤹��
- �ݥ��󥿤β���3bit��¾�����Ӥ˻Ȥ� (tagged pointer)�����ȥ�����Ȥ˻Ȥ��Ȥ��Ϻ���3�ӥåȥ��եȤ��롣
��öư���褦�ˤʤä���ΤΡ����꤬����ޤ�����
- ���ȥ�����Ȥ�3�ӥåȥ��եȤ����顢�ݥ��󥿥�������4�Х��Ȥ�32bit�������ƥ�����ǥ����С��ե���������������롣
- �ޥ��ʡ��ʥ������ƥ������Υޥ��ʡ��� malloc ������8�Х��ȥ��饤�󤷤ʤ��ä���硢�ݥ��󥿤β���3bit��Ȥ��Τ������
���θ塢2����μ����Υ��ƥʥ󥹤Ϥʤ�٤��򤱤����Τǡ�ɬ�פʴ��֤�����û���ä��ӥåȤ��������󥯤Υݥ��󥿤ǤϤʤ���������󥯤Υݥ��󥿤β��̥ӥåȤ˲��������Ȥ������ɤ�Ԥ��ޤ��������ߥ�ӥ塼�Ԥ��Ǥ���
FASTCALL �� PyFunction, PyCFunction �ʳ��Ǥ����ѤǤ���褦��
Python 3.6 �����ʳ�Ū�ˡ����󥿥ץ꥿�����Ǵؿ��ΰ����μ����Ϥ������ѹ����� FASTCALL ������Ƴ������Ƥ��ޤ���
��������Ѥ��뤿��ˡ����ߤ� Python �Ǽ������줿�ʥХ��ȥ����ɤ򥤥󥿥ץ꥿����������˴ؿ���ɽ�����饹�ȡ�C����Ǽ������줿�ؿ����᥽�åɤ�ɽ�����饹�����̰�������Ƥ��ޤ���
���ơ� Cython �Ϥ������C/C++����Ǵؿ����������ΤǤ������ȥ졼���Хå��ʤɤǥ����������ɤ�ɽ���Ǥ���褦�ˤ������ʤɡ�Python�Ȥ߹��ߤ�C����Ǽ������줿���饹�Ǥ�Â��ʤ���ǽ���ɲä��뤿��ˤ��ȼ��η���Ȥ�ɬ�פ����ꡢ��������� FASTCALL �����ѤǤ��ޤ���
�����������뤿��ˤ����Ĥ�����Ƥ�����Ƥ��ơ��ǿ��Τ�Τ� PEP 580 �ˤʤ�ޤ���
��ƼԤε����λ��������硼�äȶ����������໤�򴶤��ƤϤ���ΤǤ���������Ū�ˤϤޤ��������������Ȼפ�����������ư�����ȼ��������᤯��äƤ���Ƥ���Τǡ��Ŀ�Ū�ˤ���������ª���Ƥ��ޤ���
�ȤϤ��������⤽�� FASTCALL �äƤޤ��˲�Ū�ѹ������뤫�⤷��ʤ���������API�� Cython �������äƺ��Ѥ��Ƥ�������ǡ��ɤ��ͤ��Ƥ� PEP 580 �������ꤹ���ʤ�Ǥ���͡�
�ޤ� 3.8 �γ�ȯ�ϻϤޤä��Ф���ʤΤǡ� FASTCALL �� stable & public �����ˤǤ��ʤ����ε�����Ϥ᤿�ꤷ�ƥե������˲�äƤ��ޤ���
PEP 572 (�����黻��)
PEP 572 �ε��������夷�ޤ�����5���Language Summit �����äƤ����ǵ����Υ����С��ҡ��Ȥ�ɤ��������ʤɤ��ä����줿�ΤǤ����� LWN.net ������ �ޤȤ� ���äƤ��줿�Ȥ������顢�ޤ�ML��Ǥε������Ƴ���Ĺ��ʥ���åɤˤʤäƤ��ޤ�������
@methane
�Ƕ��Python-dev(2018-04)
�Хå��ʥ�С�:
- 2018: 1��
- 2017: 1�� | 2�� | 3�� | 4�� | 5�� | 6�� | 8�� | 9�� | 12��
Python 3.7 ���١����ˤʤꡢ�ç¤ï¿½ï¿½ï¿½Ñ¹ï¿½ï¿½Ï¤Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ ���δ֡�Python �θ��켫�Τ䥨�������ƥ�˴ؤ��ƽ��פ����꤬���Ĥ�����ޤ�����
pypi.python.org ���� pypi.org ��
Ĺǯ Python �Υ��������ƥ��٤��Ƥ���Ƥ��� PyPI ����˥塼���뤷�ޤ�����
Python 3 �ؤΰܹԤ�Ϥ�Ȥ��ƥ���󲽤��졢 Markdown �ǽ񤤤� README �������󥰤Ǥ���褦�ˤʤ�ʤɤβ��������äƤ��ޤ���
IRC ���� Zulip chat ��
freenode �� python-dev �Ȥ��� IRC �����ͥ뤬����ΤǤ������������׸��Ԥ����ߥ�˥�����������Τ˺���IRC��Ȥ��Τϥϡ��ɥ뤬�⤤�󤸤�ʤ�����Slack �� Discord �ߤ����ʥ����ʴĶ����Ƥߤʤ����Ȥ����᡼����ꤲ���ꡢ Zulip ����Ѥ��뤳�Ȥˤʤ�ޤ�����
���ΤȤ����� python-dev �Ȥ��μ��դ����Ӥ����ꤵ��Ƥ��ޤ�������̤���ɾ�ʤé¾ï¿½ï¿½Åªï¿½Ë¤â¤¦ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó¤Ë¤â³«ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ë¤«ï¿½â¤·ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
�Ŀ�Ū�ˤϡ�UI���Х��륢�ץ�δ����٤� Slack �� Discord �ˤ��ʤ�ʤ���ΤΡ����֥����ͥ�Ū�� topic �Ȥ�����ǽ�������ǡ�ʣ�������꤬���󤷤��Ȥ��ˣ��Ĥ�����˽���Ǥ����ʤ����� Slack �Υ���åɤΤ褦�˵����������ˤ����ʤ뤳�Ȥ�ʤ��Ȥ������˥��åȤ򴶤��Ƥ��ޤ���
RHEL 7.5 �� Python 2 �� deprecate
RHEL 7.5 ����꡼�����졢��꡼���Ρ��Ȥ� Python 2 �� deprecate ����ޤ������Ĥ��Υ᥸�㡼�С������ (RHEL 8?) �� Python 2 ��������� Python 3 ���������ݡ��Ȥ����褦�Ǥ���
Ubuntu 18.04 LTS ������ Python 2 �� main ��ݥ��ȥ꤫�鳰���ޤ���Ǥ������� 20.04 LTS �ޤǤˤϳ����Ǥ��礦���顢�ʥ��ݡ��Ƚ�λ��Υޥ��󤬰����Ĥ��ΤΡ� Python 2 ��Ȥä��Ķ��Ϥ������� 2025 ǯ�����˥꥿�������뤳�Ȥˤʤ�Ȼפ��ޤ���
PEP 394 ���åץǡ���
PEP 394 -- The "python" Command on Unix-Like Systems
���� PEP �ϡ� Python 2 ��3 ����ߴ��ˤ����ˤ���¤��뤿��Υ��ޥ��̾��shebang�ˤĤ��ƤΥ����ɥ饤����󶡤��Ƥ��ޤ����绨�Ĥ˸����ȼ��Τ褦�ˤʤäƤ��ޤ���
- Python 2 �����Ѳ�ǽ�ʤ� python2 ���ޥ�ɤ� Python 3 �����Ѳ�ǽ�ʤ� python3 ���ޥ�ɤ��Ѱդ��롣
- python ���ޥ�ɤ� python2 ���ޥ�ɤ�Ʊ�� Python ��ư����褦�ˤ��롣
- Python 2 �ˤ����б����ʤ�������ץȤ� shebang �� python2 ��Ȥ��� Python 3 �ˤ����б����ʤ�������ץȤ� shebang �� python3 ��Ȥ���ξ�б��Υ�����ץȤ� shebang �� python ��Ȥ���
����Ϥ����ޤǤ⥬���ɥ饤��Ǥ��ꡢ Gentoo �� Arch �Τ褦�� python ���ޥ�ɤ��ǥե���Ȥ� Python 3 �ˤʤäƤ���ǥ����ȥ�ӥ塼�����⤢�뤷�� macOS �� python2 ���ޥ�ɤ��Ѱդ��Ƥ���ޤ��󤬡�����Ǥ� Debian, Ubuntu, Fedora, Red Hat �γ�ȯ�Ԥ����Υ����ɥ饤��ˤ��Â�¤ߤ�·���Ƥ��������Ǥ�̵�����ϥޥ��Ǥ���
���ơ����Υ����ɥ饤��ϻ�����������뤳�ȤˤʤäƤ��ơ� Fedora / RHEL �� Python 2 ��ΤƤ�Τ˹�碌�Ƥɤ����뤫������ˤʤ�ޤ��������ߤ� Guido �ιͤ��Ϥ�����������ʴ����Ǥ���
- Python 2.7.10 ���Ф�ȶ��ˡ��֣���С����������פ���������Τǡ�Python 3.9 �μ���¿ʬ 3.10 �ˤʤ롣 "python3" �Ȥ������ޥ��̾��Ȥ�³����Τ�����Ϥʤ��� Python 4 �� GIL ��´�ȤȤ��ä��ç¤ï¿½ï¿½ï¿½Ñ¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½Ë¤Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
- (Dropbox �Ǥ�) �ޤ� Python 2 �� 3 ��ξ����ȤäƤ���Τǡ� "python" ����� Python 2 �Ǥ��ä��ߤ�����
- "python" ���ޥ�ɤ�¸�ߤ��ʤ��Τ�����ʤ���
- Python 3 �� venv ���ä��Ȥ��� python �Ȥ������ޥ�ɤ򥪡��С��饤�ɤ��Ƥ��ޤ��Τϴְ㤤���ä���
Python 2 ��ΤƤ�Τ򵡤� "python" ���ޥ�ɤ� Python 3 �ˤ������ä� Fedora / Red Hat �Υ��ƥʤˤȤäƤϿ�򺹤��줿���Ǥ���
�����Ǥ��Ǥ� "python" ���ޥ�ɤ� Python 3 �ˤʤäƤ���ǥ����ȥ�� venv �ϸ�¸����Τǡ������� "python" ���ޥ�ɤ� Python 3 ��ؤ����Ȥ�ػߤ��뤳�Ȥ⤷�ޤ��󡣷����Ȥ��ơ�����Υ��åץǡ��Ȥ��ç¤ï¿½ï¿½ï¿½Ñ¹ï¿½ï¿½ï¿½ï¿½Ï¼ï¿½ï¿½Î¤è¤¦ï¿½ï¿½ï¿½Ñ¹ï¿½ï¿½Ë¤Ê¤ï¿½Þ¤ï¿½ï¿½ï¿½
- "python" ���ޥ�ɤ�¸�ߤ��ʤ����ɤ� (¸�ߤ�����ϡ����ޤ��̤� "python2" ���ޥ�ɤ�Ʊ��Ǥ���٤�)
- (���� PEP ��Í���ʴ������) "python" ���ޥ�ɤ� "python3" �ˤʤ뤳�Ȥ���Ԥ������������
�Ȥ������Ȥǡ����᤯�ɤ��Ǥ� python �Ȥ������ޥ�ɤ� Python 3 �ˤʤ�ʤ����ʡ��פȤ�����˾�ϼΤƤơ� "python3" �������ʿ侩����륳�ޥ��̾�ʤ���Ȥ������Ȥ˴��줿�ۤ����ɤ������Ǥ���
PEP 572 -- Assignment Expressions
Python �Ϥ��ä��������ʸ (statement)�פȤ��Ƥ��ޤ������������� :=
�Ȥ����黻�Ҥ����������ɲä��褦�Ȥ�����ƤǤ���
�㤨�м��Τ褦�ʥ����ɤ��񤱤�褦�ˤʤ�ޤ���
# 572 ������Ȥ� if m := re.match(pat, s): # do something with m # �ʤ��Ȥ� m = re.match(pat, s) if m: # do something with m
�᡼����̤����礹����Τ�̼�������������ä��ΤǴ����ˤϵ������ɤ��Ƥʤ���Ǥ������ǽ�Υ���١������ϥꥹ������ɽ�����ͤκ����Ѥ򤷤����Ȥ������Ȥ��ä��Ȼפ��ޤ���
# foo() �򣲲�׻����Ƥ��ޤäƤ��� ys = [foo(x) for x in xs if foo(x) is not None] # ���Ǥ�ꤿ�� ys = [z for x in xs if (z := foo(x)) is not None]
����ɽ���˸¤ä���ʸ��ĥ�䡢�����˥֥��å��������פ��ɲä���ʤɡ�������ʥ����ǥ����Фޤ�����������ץ뤵���������ΥХ�󥹤Ǻ�����Ƥ�����å¤ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
�ȤϤ����� Python �Ϥ��äȡ�������ʸ�פȤ�������ȶ��ˤ��ä�����ʤΤǡ�������Ƥ����󤬤⤿�餹�������򼺤碌���ΤǤ⤢��ޤ���
���ޤǤ�ʣ���ʼ����ɤ����Ф��Ƥ�������ƨ��������̵���ä��Τ���PEP 572 ����ǧ���줿���ϡ���ʬ��������ƨ���Ƥ��ʤ��������ʤ��饳���ɤ��ɤ�ɬ�פ��ФƤ��ޤ���
�ʤΤǡ��ɲä����������˻Ȥ�����������ɤ⺣���ʳ��Ǥ� +1 �Ϥ��ʤ��פȤ��������ɤ�¿���Ǥ�����ȿ�Фοͤ⤤�ޤ�����⿵���ɤΰ�ͤǡ����åȤ����������ʤ����̡����١ˤǤ��������Ƥۤ����ʤȻפäƤ��ޤ���
���ȼ����⤢��ΤǶ�̣�Τ���ͤϻ�ƤߤƤ����������ʤǤ�ML�Ǥε����˻��ä���Ȥ������Ťˤ��ꤤ���ޤ�����
@methane
�Ƕ��Python-dev(2018-01)
�Хå��ʥ�С�:
- 2017: 12��� | 9��� | 8��� | 6��� | 5��� | 4��� | 3��� | 2��� | 1���
Python 3.7b1 ��29����ͽ��Ǥ�������ʤ�������ܻ��֤κ�����˽Ф�Ϥ��Ǥ�����buildbot��Travis���԰���ʤΤǾ����٤�뤫�⤷��ޤ��󡣤���� feature freeze �ʤΤǿ���ǽ�ɲä�ѥե����ޥ󥹸���ʤɤϴ���Ū�˽����Ǥ���
beta ���ζ���ߤǡ�����ǾҲ𤷤�Accept���줿PEP����������緿���ߥåȤ���������ޡ�������ޤ������ʴ֤˹��ʤ��ä���Τ�̵���Ϥ������֤󡣡�
����ϻ䤬�ط����Ƥ����Ȥ������濴�˾Ҳ𤷤Ƥ����ޤ���
dict �ν���θ�����Ͳ�
Python 3.6 ���� dict �������������¸����褦�ˤʤ�ޤ����������ε�ư�ϼ����ܺ٤Ǥ��ꡢ�ޤ�������ͤǤϤ���ޤ���Ǥ��������Τ��ᡢ¾�� Python ������Ʊ����ư�ˤʤ뤳�Ȥ��ݾڤ���ޤ��󡣶���Ū�ˤ� PyPy ��Ʊ����ư�ʤȤ�����CPython��PyPy�����򿿻������ˤǤ����� MicroPython �ϰ㤤�ޤ���
���ν���˰�¸���ʤ��褦�ˡ������Ǥϰݻ����Ƥ������򥤥ƥ졼�Ȼ��˥����ಽ����褦�ʲ�¤�򤹤뤫�������������ä��λ�������ͤˤ��Ƥ��ޤ����Ȥ������꤬���äơ���̤Ȥ��� 3.7 ����ϸ�����ͤˤʤ뤳�Ȥˤʤ�ޤ�����
����˴�Ϣ���ơ��ͤ� collections.OrderedDict �����󥯥ꥹ�Ȥ��äƥ�������̤�Ⱦ������������Ƥ����ΤǤ������������ݻ����뤿������ʤ� dict ��Ȥ���ΤǤ��μ����ϥǥ�������ˤʤ�ޤ�����
hasattr(), getattr() ����
https://github.com/python/cpython/pull/5173
hasattr(), getattr() ��õ������°�������Ĥ���ʤ���硢�����ǰ��� AttributeError ��ȯ�����Ƥ��餽��򰮤�Ĥ֤��ơ� hasattr �ʤ� False, getattr �ʤ��軰�������Ϥ��줿�ǥե�����ͤ��֤��Ȥ�����ư�򤷤Ƥ��ޤ�����
�����㳰��ȯ����������٤����Ȥ߹�碌���㴳�Υ����С��إåɤˤʤäƤ���ΤǤʤ�Ȥ��������ΤǤ��������٤ƤΥ������Dz��򤹤뤳�ȤϤǤ��ޤ��� Python �� __getattr__
��������Ƥ���Ȥ��ˤ� AttributeError ���ꤲ��Τ���ޤ�ʥץ��ȥ���ˤǤ�����C��٥�Ǥ������������ tp_getattro �Ȥ��������åȤ�Ʊ���ץ��ȥ���ˤ�ȤŤ��Ƥ��ޤ���
��������°�����������ˤĤ��Ʋ��餫�Υ������ޥ��������פʾ�硢 tp_getattro �ˤϥǥե���Ȥ� PyObject_GenericGetAttr() �Ȥ����ؿ��ݥ��󥿤����ꤵ��Ƥ��ޤ��� tp_getattro ��ƤӽФ����ˡ����줬 PyObject_GenericGetAttr �Ǥ���С�°�������Ĥ���ʤ��ä����Ȥ��㳰��Ȥ鷺���֤��ü첽���줿�ؿ���Ƥ֤褦�ˤ��ޤ�����
����ǡ� getattr �򥫥����ޥ������Ƥ��ʤ�¿���η��� getattr() �� hasattr() ����®�ˤʤ�ޤ�����
�㤨�� Django �Υƥ�ץ졼�Ȥ� hasattr(s, '__html__')
�Ȥ��Ƥ���Ȥ��������ꡢ���ʤ�β���� False ���֤��Τǡ�������®���Ǥ������Ȥ��ǧ���Ƥ��ޤ���
��� hasattr(), getattr() �������®�����Ƥ����ΤǤ���������� Serhiy ���� _PyObject_Lookup �Ȥ���̾���ο��ץ饤�١���API�Ȥ����������ơ� Python ������ PyObject_GetAttr() ��Ƥ�Ǥ��� AttributeError ��ä��Ƥ������٤ƤθƤӽФ�����API��Ȥ��褦�˽ñ¤´ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
������߹���
�㤨�� 1 + 2
�Ȥ��������ɤ����ä��Ȥ���1 �� 2 �Ȥ�������򥹥��å����Ѥ�Ǥ��� BINARY_ADD ����Ȥ����Х��ȥ����ɤ���ö����ޤ���
���θ塢 peephole �ȸƤФ�Ƥ���Х��ȥ����ɥ�٥�κ�Ŭ���ǡ�Ϣ³���� LOAD_CONST �Τ��Ȥ� BINARY_ADD ���褿�Ȥ��ϡ�1 + 2 ��׻����Ƥ��ޤäƷ�̤� 3 ������ơ��֥����Ͽ����1�Ĥ� LOAD_CONST ���֤�������Ȥ�����Ŭ���򤷤Ƥ��ޤ����������������߹��ߤȤ����ޤ���
�������������ˡ�ˤϷ���������ޤ��������߹������˥ơ��֥�����äƤ�����������פˤʤ뤫�⤷��ʤ��Τˡ����Τޤ޻ĤäƤ��ޤäƤ����ΤǤ������Υ���ץ륳���ɤǤϡ����3�������Ѥ��Ƥ��ʤ��Τˡ�1��2���ơ��֥�˻ĤäƤ�����Ǥ��� (�ʤ���co_consts �κǽ�ˤ��� None �� docstring �ʤΤǾä��ޤ���)
>>> import dis >>> def x(): ... return 1+2 ... >>> x.__code__.co_consts (None, 1, 2, 3) >>> dis.dis(x) 2 0 LOAD_CONST 3 (3) 2 RETURN_VALUE
������߹��ߤΤ��Ȥ�����ơ��֥��ƹ��ۤ���Ȥ�����Ŭ������Ƥ��줿���Ȥ⤢��ޤ���������ơ��֥��2����ľ������������߹��ߤ�Х��ȥ�������������AST���ʳ��Ǥ�äƤ��ޤ������ڤ��ɤ��������Ȥ������ȤǵѲ�����Ƥ��ޤ�����
������AST��٥��������߹��ߤϡ�Eugene Toder���󤬼�������Ƥ����ΤǤ���������ⲿǯ�����֤���Ƥ��ޤ����� ����򸫤Ĥ��ƺ��ΥС�������ư���褦�˼�ľ���ơ� Python 3.7 ������ޤ����� Python 3.7 �ǤϾ����Ϥ����ʤ�ޤ���
>>> x.__code__.co_consts (None, 3) >>> dis.dis(x) 2 0 LOAD_CONST 1 (3) 2 RETURN_VALUE
TextIOWrapper �� encoding ���ѹ���ǽ��
��Python 3.7 �ǥƥ����ȥե�����Υ��󥳡��ǥ��󥰤���������ѹ���ǽ�ˤʤ�ޤ��� �Ȥ��������ǾҲ𤷤��ΤǤ�����򻲾Ȥ��Ƥ���������
lru_cache �ξʥ��경
functools.lru_cache
�� dict ����������󥯥ꥹ�Ȥ�Ȥä� LRU ��������Ƥ��ޤ���
dict ����������󥯥ꥹ�ȤȤ����Ȥ߹�碌�� OrderedDict ��Ʊ���Ǥ���Ʊ��������2���ढ��Τ�̵�̤��ʤ��Ȼפäư��� OrderedDict ��Ȥ����ǽ�ľ���Ƥߤ��ΤǤ������ѥե����ޥ󥹤�����Ƥ��ޤ��ޤ����� OrderedDict �� dict ��Ѿ����Ƥ��뤷����ߤ������ơ����Ǥ���������ʤɤ�������õ����ʤ�ɤ����ľ���Ƥ��뤳�Ȥ����ꡢ dict + ��������󥯥ꥹ�ȤȤ��Ƥμ����� lru_cache ��������������������Ū����ľ���ä��ΤǤ���
�Ȥ������ȤǤ��λ�ߤϼ��Ԥ����ΤǤ��������κݤ� lru_cache ���������ꥹ�Ȥγƥ���ȥ꤬GC��ǽ���֥������ȤˤʤäƤ��뤳�Ȥ�ȯ�����ޤ���������ˤ�ꡢ�����Ǥ��Ȥ�3��� (64bit �ޥ���Ǥ� 24byte) �Υ����С��إåɤ������ꡢGC�ν������֤�Ĺ���ʤ�ޤ���
Python �ν�󻲾�GC��ư�����ˤϡ��ƥ���ȥ����̤��������Ƥ���ʤ��Ƥ� lru_cache ���Τ����������Ȥ��˥�󥯥ꥹ�Ȥ��Ӥ�ƹԤ��Ф���Ȥ������Ȥ�פ��Ĥ����ƥ���ȥ��GC�إå��������뤳�Ȥ��Ǥ��ޤ���������ǥ���å��夵��Ƥ������ǿ� * 24�Х��Ȥκ︺�ȡ�lru_cache��إӡ��˻ȤäƤ��륢�ץ�Ǥ�GC®�٤θ��夬������ޤ���
ABC��C����
https://github.com/python/cpython/pull/5273
Python �ε�ư���֤��٤�����3���װ��� ABC �� Enum ������ɽ���Ǥ��������Ǥ��и���
��ư���ˤۤܳμ¤� import �����⥸�塼��� _collections_abc ������ΤǤ���������򸫤�ȡ���������� ABC ��������졢��������η��������� register ����Ƥ���Τ��狼��ޤ���
�����˾Ҳ𤷤� importtime ���ץ����dz�ǧ���Ƥߤޤ���
$ local/py37/bin/python3 -Ximporttime -c 42 import time: self [us] | cumulative | imported package ... import time: 74 | 74 | _stat import time: 202 | 275 | stat import time: 166 | 166 | genericpath import time: 244 | 409 | posixpath import time: 1696 | 1696 | _collections_abc import time: 725 | 3105 | os import time: 218 | 218 | _sitebuiltins import time: 160 | 160 | _locale import time: 155 | 315 | _bootlocale import time: 500 | 500 | sitecustomize import time: 220 | 220 | usercustomize import time: 692 | 5047 | site
ABC�������register��ξ������Ū�˹�®�����뤿��ˡ�Ivan Levkivskyi ���� (�ĤŤ꤬�񤷤�) ��C�������äƤ��줿�ΤǤ������������꤬���äƶ��Ϥ��Ʋ�����Ǥ���
�̤Ȥ��Ƥ�¿���ʤ�������ɥ᥿���饹�� weakref �򰷤��Τ���������������Τ����ݤʤ�Ǥ���͡�����
�ʤ�Ȥ� 3.7b1 �ޤǤ˥ޡ������Ƥ�����ʤ�ư�������ʤȤ����ޤǤϻ��äƤ��ä��ΤǤ����� 3.7 �Υ�꡼���ޥ͡����㡼�� b1 ��ˤ��Ƥ��ɤ�����㳰��ǧ��Ƥ��줿�Τǡ���ö����夤�Ƽ������á¤Ä¾ï¿½ï¿½Í½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½
���줬�ޡ��������ȡ� Python �ε�ư���� (python -c 42
) �Ϥ���ʴ����ˤʤ�ޤ���
�С������ | ��ư����(ms) |
---|---|
3.6 | 16.4 |
3.7b1 | 14.4 |
3.7b1 + C-ABC | 13.9 |
�ޤ��� python -c 'import asyncio'
�λ��֤⡢ Python 3.6, 3.7b1, C-ABC �� 88.2ms -> 58.7ms -> 57.6ms ���᤯�ʤä���Ƥ��ޤ���
(�ɵ�) str, bytes, bytearray �� isascii() �᥽�åɤ��ɲ�
Python �� str �� isdigit() �ʤɤΥ᥽�åɤ� Unicode �б����Ƥ��뤿�����ASCIIʸ�����Ф��Ƥ� True ���֤��Ƥ��ޤ��ޤ����ޤ� int() �� Unicode �б����Ƥ��ޤ���
>>> s = "������" >>> print(ascii(s)) '\uff11\uff12\uff13' >>> s.isdigit() True >>> int(s) 123
��������ASCIIʸ������������դ������Ȥ����������⤢��Ǥ��礦�����λ��� .encode('ascii') ���㳰���ꤲ�ʤ��������å�����Τϼ�֤Ǥ���
������ str.isascii() �᥽�åɤ��ɲä���Ƥ��ޤ����������Ȥ��� s.isascii() and s.isdigit()
�� ASCII �������������Ȥ��Ƥ��뤫������å��Ǥ��ޤ���
���������ʰո��Ϥ��ä���Τδ���Ū��ȿ�аո��Ϥʤ��ơ�Guido��bytes��bytearray�ˤ�Ʊ���᥽�åɤ��ɲä��Ƥ����ƤȤ�����å������Ƿ�ޤ�ޤ�����
�������äȤ��ơ� str �������� ASCII �ե饰����äƤ��� (���Υե饰�� UTF-8 �ؤΥ��󥳡��ɤ������åפǤ���) �Τ� O(1) �Ǥ����� bytes �� bytearray �ϥХ�������Ӥ�ƺǾ�̥ӥåȤ�Ω�äƤ��ʤ��������å����Ƥ���Τ�ʸ����Ĺn���Ф��� O(n) �ˤʤ�ޤ���
(�ɵ�) PEP 567 -- Context Variables
������Ȥ鷺�˴ؿ��ƤӽФ���Ķ���ƾ��֤������ꤿ����������ޤ���
�㤨��Web���ץꥱ���������Ȥ����顢������񤯻��˸��ߤΥꥯ�����Ȥ�ID�Ȥ��桼����ID��Ĥ���������ɤ⡢����������Ƥδؿ��ΰ����ˤ������ɲä������ʤ��ʤɤǤ���
Python ��ɸ��饤�֥��Ǹ����С� decimal �⥸�塼�뤬�黻���٤ʤɤ򥳥�ƥ����ȤȤ��ƴ������Ƥ��ޤ���
�������ä����֤ϡ��ޥ������åɤǤϥ���åɤ��Ȥ˥���ƥ����Ȥ��ۤʤ�Τǡ�����ϥ���åɥ��������ѿ��˳�Ǽ���Ƥ��ޤ�����
�������� asyncio �ʤɤ���Ʊ���ե졼�����Ǥϡ�ʣ���Υ���ƥ����Ȥ����ĤΥ���åɤ�ư���Τǡ�����åɥ�������ǤΥ���ƥ����ȴ��������ޤ��Ԥ��ޤ��󡣤����ǥ���åɤ���Ω��������ƥ����ȴ����Τ���Υ饤�֥�꤬ PEP 567 ���ɲä���ޤ�����
�����Ȥ��С��ƥ���åɤ��ָ��ߤΥ���ƥ����ȡפ���äƤ����ΤΡ�����å���ǥ���ƥ����Ȥ��ڤ��ؤ�������Ū�ˤǤ���Τǡ� asyncio ���ȥ��٥�ȥ롼�פ��ؿ��ƽФ�������ˤ��Υ���ƥ����Ȥ��������Ƥ�뤳�Ȥ��Ǥ��ޤ���
ML�Ǥε�����Ĺ�����ƻ�ϸ��Ƥʤ��ä��ΤǤ������������� Accept ���줽�����Ȥ����Ȥ����ǰ��ꤵ��Ƽ��������Υ�ӥ塼�򤷤Ƥ��ޤ�����
���������Ȥ��Ƥ� HAMT �ȸƤФ�륢�르�ꥺ������Ѥ��Ƥ��ơ�̾����ʹ�������Ȥ����ä���ξܺ٤��Τ�ʤ��ä��Τǡ���������򤷤ʤ���C�������ӥ塼����Τϳڤ����ä��Ǥ���
Python���ץ�ε�ư���®������
pipenv 9.0.2 �Υ�꡼����CLI�������ʹ�®���򤷤��Ȥ������ʥ��󥹤򸫤����ޤ�����
Just released Pipenv v9.0.2, which includes massive CLI speedups! https://t.co/AGD8Hkq1EG
— Kenneth Reitz 🐍 (@kennethreitz) 2018ǯ1��16��
��̣����äƤ����˻�Ƥߤ��ΤǤ��������ޤ�®���������ޤ���Ǥ����������� Python 3.7 �ο���ǽ��Ȥä�®�٤�Ĵ�����뤳�Ȥˤ��ޤ�����
���ε����ǤϤ��ο���ǽ�ȼºݤλȤ�����Ҳ𤷤ޤ���
��ư���� �� import����
pipenv -h
�Τ褦�ʥ��ޥ�ɤμ¹Ի��֤ϡ��ºݤ˥إ�ץ�å�������ɽ�����뤿��λ��֤��⤺�ä�Ĺ���ʤ�ޤ���
���ץꥱ������󤬵�ư����Ȥ��ˤϡ�����ե�������ɤ߹��ߤʤɰ���ν�����ɬ�פˤʤ��ΤǤ���
��������Python���ץꥱ�������ξ�硢�⥸�塼��Υ���ݡ��Ȥ���ư���֤��ؤɤ򤷤�����¿���Ǥ���
���Ȥ��л�δĶ��Ǥ� pipenv --version
�� 800ms �����ä��ΤǤ��������Τ��� 700ms �� import pipenv
�˻Ȥ��Ƥ��ޤ�����
$ time local/py37/bin/python3 -c 'import pipenv' real 0m0.696s user 0m0.648s sys 0m0.048s $ time local/py37/bin/pipenv --version pipenv, version 9.0.3 real 0m0.812s user 0m0.761s sys 0m0.052s
�⥸�塼���import�ˤ����ä����֤�ɽ������
Python 3.7 �Ǥϥ⥸�塼���import�ˤ����ä����֤�ɽ�����뵡ǽ���ɲä���ޤ�����
���ε�ǽ�� -X importtime
���ץ���󤫡� PYTHONPROFILEIMPORTTIME=1
�ȴĶ��ѿ������ꤹ�뤳�Ȥ�Í���ˤʤ�ޤ���
���Ȥ��� pipenv ��Ĵ�����������ϼ��Σ��Ĥ���ˡ������ޤ���
$ python3.7 -X importtime -c 'import pipenv' 2> pipenv-imports �ޤ��� $ PYTHONPROFILEIMPORTTIME=1 pipenv --version 2>pipenv-imports
���Ԥ� import pipenv
������Ĵ��������Ԥ� pipenv
���ޥ�ɼ¹�������Ƥ� import ��Ĵ������Ȥ����㤤������ޤ���
��Ԥν��Ϸ�̤��㤬 ������ �Ǥ���
import���֤���Ϥ���
���ν��Ϸ�̤κǸ����ʬ�򸫤Ƥߤޤ���
import time: self [us] | cumulative | imported package ... import time: 3246 | 578972 | pipenv.cli import time: 507 | 579479 | pipenv
�Ǹ�ιԤα�¦�� 579479 �ϡ� import pipenv
�˥ȡ������ 579479us �����ä����Ȥ��̣���Ƥ��ޤ���
pipenv �� import ����֤ˡ����������¾�Υ⥸�塼�뤬 import ����ޤ��������Ǹ����С� pipenv �� pipenv.cli �� import ���Ƥ��ޤ���(���� import �ϣ����ڡ����ǥ���ǥ�Ȥ���ޤ�)
�Ǹ�ιԤκ�¦�� 507 �ϡ� pipenv �⥸�塼��ñ�Τ� import (�⥸�塼��Υ������Х�μ¹Ԥ�ޤ�) �ˤ��ä� 507us �����ݤ��äƤ��ʤ����Ȥ��̣���Ƥ��ޤ���579 479 - 507 = 578 972us ������import�˳ݤ��äƤ��ޤ���
�٤���ʬ�򸫤Ĥ���
�����ν��Ϥ��顢���֤�ȤäƤ�����ʬ�ڤ�õ���ޤ��礦�����Ĥ��ιԤ�ȴ�褷�ޤ���
import time: self [us] | cumulative | imported package ... import time: 86500 | 179327 | pkg_resources ... import time: 385 | 236655 | IPython import time: 22 | 236677 | IPython.core import time: 26 | 236703 | IPython.core.magic import time: 978 | 237680 | dotenv.ipython import time: 199 | 239032 | dotenv ... ... import time: 3246 | 578972 | pipenv.cli import time: 507 | 579479 | pipenv
pkg_resources
�ǽ�˸��Ĥ����Τ� pkg_resources �Ǥ������ܤ��Ƥۤ����Τϡ����Υ⥸�塼�뤬����ǥ�Ȥ���Ƥ��ʤ����ȤǤ����Ĥޤꡢ pipenv
�⥸�塼�뤫�����Ū�� import ����Ƥ���櫓�ǤϤʤ��ΤǤ���
�ºݡ� pkg_resources
�� pipenv
������ץ� ���� import ����Ƥ��ޤ�����
$ cat local/py37/bin/pipenv #!/home/inada-n/local/py37/bin/python3.7 # EASY-INSTALL-ENTRY-SCRIPT: 'pipenv==9.0.3','console_scripts','pipenv' __requires__ = 'pipenv==9.0.3' import re import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit( load_entry_point('pipenv==9.0.3', 'console_scripts', 'pipenv')() )
pkg_resources �� import ���٤��Τϴ��Τ�����ǡ������ߴ�����������˽�������Τ��񤷤�����Ǥ���
�������� pkg_resources �� import �ϲ��򤹤뤳�Ȥ��Ǥ��ޤ���
$ local/py37/bin/pip install wheel $ local/py37/bin/pip install -U --force-reinstall pipenv $ time local/py37/bin/pipenv --version pipenv, version 9.0.3 real 0m0.704s user 0m0.653s sys 0m0.052s
����ǡ� pipenv --version
���ޥ�ɤμ¹Ի��֤ϤۤȤ�� import pipenv
�λ��֤��������ʤ�ޤ�����
wheel �����󥹥ȡ��뤵��Ƥ������ pip �ϥ������ѥå����� (.tar.gz �ʤ�) �����������ɤ��Ƥ��Ƥ⡢��ö wheel (.whl) ��ӥ�ɤ��ơ� wheel ���饤�󥹥ȡ��뤷�ޤ��� ������ wheel ���饤�󥹥ȡ��뤹����ȥ������ѥå��������饤�󥹥ȡ��뤹����ǥ�����ץȤ���������������ۤʤꡢ wheel ���饤�󥹥ȡ��뤷�����ˤ� pkg_resources ���Ȥ��ʤ��ΤǤ���
$ cat local/py37/bin/pipenv #!/home/inada-n/local/py37/bin/python3.7 # -*- coding: utf-8 -*- import re import sys from pipenv import cli if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit(cli())
�Ĥޤꡢ wheel �򥤥󥹥ȡ��뤷�Ƥ����С��������ѥå������������ۤ��Ƥ��ʤ��ġ���򥤥󥹥ȡ��뤹����ˤ�����;�פʻ��֡ʻ�δĶ��ǤϤ����褽100ms���١ˤ���򤹤뤳�Ȥ��Ǥ��ޤ���
IPython
���˸��Ĥ����٤���ʬ�Ϥ����Ǥ���
import time: 385 | 236655 | IPython import time: 22 | 236677 | IPython.core import time: 26 | 236703 | IPython.core.magic import time: 978 | 237680 | dotenv.ipython import time: 199 | 239032 | dotenv
pipenv
�� dotenv
�� import ���ơ� dotenv
�� dotenv.ipython
�� dotenv.ipython
�� IPython
�� import ���Ƥ��ޤ���
���줬����δĶ� (IPython �����󥹥ȡ��뤵��Ƥ���) �� pipenv �ε�ư���٤��������������ͳ�Τ褦�Ǥ���
�������ʤ� IPython �� import �����ΤǤ��礦�� dotenv �Υ��������ɤ�Ǥߤ��ꡢ�ɤ���� IPython extension �Τ���褦�Ǥ���
������� pipenv �䤽��¾��¿���� dotenv �Υ桼���������Ǥ� IPython extension �ϻȤ��ޤ��󡣤ʤΤ� dotenv ������ǥޥ�ɤ� IPython �� import ����褦�� �ץ�ꥯ������ �����äƤ����ޤ�����
�ޤ��� pipenv �� dotenv �˥ѥå������Ƥ��ȼ����ԡ�������������Ѥ��Ƥ���Τǡ��������� dotenv.ipython
������� �ץ�ꥯ������ �����äƤ����ޤ�����
�ޤȤ�
pipenv --version
�μ¹Ի��֤� 800ms ���� 500ms �˺︺���뤳�Ȥ��Ǥ��ޤ�����
$ time local/py37/bin/pipenv --version pipenv, version 9.0.3 real 0m0.503s user 0m0.463s sys 0m0.040s
���Τ褦�ˡ�Python 3.7 �� import ���֥ץ��ե�����ϡ�CLI���ץꥱ�������ε�ư���֤��®�����뤿��ˤȤƤ������Ǥ���
@methane
Python 3.7 �ǥƥ����ȥե�����Υ��󥳡��ǥ��󥰤���������ѹ���ǽ�ˤʤ�ޤ�
Python �Υƥ����ȥե����� (��̩�ˤ� io.TextIOWrapper) �Ϥ��ޤޤǥ��󥹥ȥ饯���Ǥ������󥳡��ǥ��󥰤���ꤹ�뤳�Ȥ��Ǥ��ޤ���Ǥ�����
�ä�ɸ�������� (sys.stdin, sys.stdout, sys.stderr) �Υ��󥳡��ǥ��󥰤����ꤹ��ˤϴĶ��ѿ� PYTHONIOENCODING �����Ѥ��뤷���ʤ������ץꥱ�����������ե�����ʤɤ˴�Ť��Ƥ����Υ��󥳡��ǥ��󥰤��ѹ�����ˤ� sys.stdin �� sys.stdin.fileno() �� sys.stdin.buffer ������ľ���ʤɤΥϥå�Ū����ˡ�����Ȥ��ޤ���Ǥ�����
Python 3.7 ����� TextIOWrapper �� reconfigure() �᥽�å� �᥽�åɤ��ɲä��졢�����Υ��󥹥ȥ饯�������ꤹ�륪�ץ������ѹ���ǽ�ˤʤ�ޤ��� �����ƺ������Υ᥽�åɤ� encoding, errors, newline �Υ��ݡ��Ȥ��ɲä��ޤ����� (���ߥå�)
����ˤ�� sys.stdin.reconfigure(encoding='EUC-JP')
�Τ褦�ˤ��ƥ��󥳡��ǥ��󥰤��ѹ����뤳�Ȥ��Ǥ��ޤ���
Python 3.7 �� PEP 538 �� 540 �ˤ�ä� UTF-8 ��Ȥ��¤�ˤ����ƤϤۤ������ʤ����֤ˤʤä��Ȼפ��ޤ���������� UTF-8 �ʳ���ɬ�פʾ��ˤĤ��Ƥ��one obvious way�פ��󶡤Ǥ���褦�ˤʤä��Ȼפ��ޤ���
�������Ȥ��ơ�read¦�ˤĤ��Ƥϡ������Ǥ� read ���Ƥ�����ѹ��Ǥ��������顼�ˤʤ�ޤ�������� TextIOWrapper �����ǡ���¦��bufferd IO�ˤ��餢�����٤Τ����ޤ�ǥХ�����������ꡢ�����Хåե����֤��ƥǥ����ɤ��Ʋ��ԤǶ��ڤä��֤��Ƥ���Τǡ��Ȥ��˾��֤��ĥ��󥳡��ǥ��󥰤Υǥ�������ȤäƤ�����ˡ��֤����Ȥ����ޤǡפȡ֤���ʹߡפΥХ���ñ�̤Ǥζ��ڤ��Ĥ���Τ��񤷤�����Ǥ���
�ñ¤¹ï¿½ï¿½ï¿½Â¦ï¿½Ë¤Ä¤ï¿½ï¿½Æ¤Ï¡ï¿½Ã±ï¿½ï¿½ flush() ���Ƥ��鿷�������󥳡��ǥ��󥰤Υ��󥳡�������ľ���Ф����Τǡ����椫��Υ��󥳡��ǥ��󥰤��ѹ��ˤ��б����Ƥ��ޤ���
@methane
�Ƕ��Python-dev(2017-12)
�Хå��ʥ�С�: 9��� | 8��� | 6��� | 5��� | 4��� | 3��� | 2��� | 1���
@methane �Ǥ��� ISUCON �����äƤ��Ф餯�֤������Ƥ��ޤ��ޤ��������ߥåȤ�ML��ε������ɤ��Ƥʤ��ΤǤ�����1������Python 3.7��beta1 (=feature freeze)��ͽ�ꤵ��Ƥ��뤿��ˡ�Python 3.7 ����ɸ�ˤ��Ƥ��� PEP ��������������accept���줿�Τǡ�������Ҳ𤷤Ƥ����ޤ���PEP 540 UTF-8 mode
https://www.python.org/dev/peps/pep-0540/
PEP 538 (locale coercion) �ȥ��åȤǡ��䤬 BDFL-delegate (PEP �� accept ������Ǥ��) �ˤʤä� PEP �Ǥ���
���� PEP ������Ϥ��ʤ�Υܥ�塼�बÍ�ä��ΤǤ��������Ǥ� PEP 538 �� accept �����Τǡ�������䴰���뵡ǽ�Ȥ��������˥���ץ벽���ޤ�����
PEP 538 �Ǥϡ���ư���� locale �� C �Ǥ��ä��Ȥ��ˡ� LC_CTYPE �� C.UTF-8 �ʤɤؤ��ѹ����ߤޤ��� �ޤ���C locale �Ǥ�ɸ�������ϤΥ��顼�ϥ�ɥ餬 surrogateescape �ˤʤꡢ�㤨�� stdin �����ɤ��ʸ����򤽤Τޤ� stdout �˽񤯾��ʤɤ���ASCIIʸ�����Ф��Ƥ�Х���Ʃ��ʿ����񤤤򤹤�ΤǤ���������� C.UTF-8 �ʤɤ� coercion �������åȤȤʤ� locale �ˤ�Ŭ�Ѥ��ޤ���
PEP 540 �⡢ locale ���ѹ����ʤ��ʳ�������Ʊ�������񤤤򤹤�褦�ˤʤ�ޤ���������Ū�ˤϼ��ΤȤ���Ǥ���
- stdin, stdout �� encoding/error handler �� UTF-8/surrogateescape �ˤʤ�
- sys.getfilesystemencoding() �� locale.getpreferredencoding() �� UTF-8 ���֤�
PEP 538 �Ȱ�äƼºݤ� locale ���ѹ�����ʤ��Τǡ��㤨�� readline �����ܸ����ϤϤǤ��ʤ��ޤޤǤ�����C locale �ʳ�¸�ߤ��ʤ�����ƥ����� Python ��ư�����Ȥ��˥ǥե���Ȥ�UTF-8��ȤäƤۤ����Ȥ����褦�����ӤˤϤ���ǽ�ʬ�Ǥ���
PEP 563 Postponed Evaluation of Annotations
https://www.python.org/dev/peps/pep-0563/
from __future__ import annotations
��񤯤��Ȥǡ��ؿ����Υơ������ɾ�����줺��������ʸ����ˤʤ�ޤ����ȤϤ��������������ɤ�Ȥ��˹�ʸ�Ȥ��Ƥϥ����å������Τǡ�Ǥ�դ�ʸ���󤬤�����櫓�ǤϤ���ޤ���
����ˤ�ꡢ���Υơ�������񤯤��Ȥˤ����ǽ�Υ����С��إåɤ򸺤餹���̤�����Τȡ����Υơ��������ʬ��̾�����Τ���� forward references �����פˤʤäƽ񤯤Τ��ڤˤʤ�Ȥ������̤�����ޤ���
����ư��� Python 4 ����ǥե���Ȥˤʤ�ͽ��ʤΤǡ� Python 3.7 �˰ܹԤ����ͤ����ˤ���ư���Í���ˤ��뤳�Ȥò¤ª¤ï¿½ï¿½ï¿½ï¿½á¤·ï¿½Þ¤ï¿½ï¿½ï¿½
�Ŀ�Ū�ˤϡ��¹Ի���ɾ������ʤ��ʤ뤳�Ȥǡ�Python �ι�ʸ��¹Ի��ˤϵ�����ʤ��������Ѥ����ꡢ���뤤�ϥ��Υơ��������ʬ�Ǥ������ѤǤ��ʤ���ʸ���ɲä���Ȥ����ʲ��ؤ�ƻ���������Ȥ������Ǥ���Ԥ��Ƥ��ޤ����㤨�и��� Union[int, str]
�Ƚ񤤤Ƥ�����ʬ�� int or str
���뤤�� int | str
�Ƚ񤱤�褦�ˤ�����Ƥ��Ǥ��뤫�⤷��ޤ��󡣡����Ԥ�ɾ������Ȥ����� int �ˤʤꡢ��Ԥ�ɾ������� | �������Ǥ����� TypeError �ˤʤ��
PEP 560 Core support for typing module and generic types
https://www.python.org/dev/peps/pep-0560/
���ޤޤ� type hint �� Python 3 ���ɲä��줿�ؿ����Υơ������ʳ��ˤ����̤� Python ���Ф��뵡ǽ�ɲä�ɬ�פȤ��ʤ��褦���߷פ���Ƥ��ޤ������� typing ���������٤�������������Ƥ���Τǡ��������� typing ��������褹�뤿��� Python ���Τ˼������Ƥ⤤��褦�Ȥ����Τ����� PEP �Ǥ���
�㤨�С� typing.List
�� class List(list, MutableSequence[T], extra=list): ...
�Ȥ����������Ƥ��ޤ���
���� MutableSequence[T]
����ʬ�Ǥ������ƥ��饹�ˤʤ뤿��˥��饹�Ǥʤ��Ȥ����ʤ��Ȥ������¤�����ޤ������Τ���˼ºݤ˿ƥ��饹�ˤʤäƤ��ޤ��ΤǼºݤ˥᥽�åɤ��󶡤��Ƥ��ʤ����饹�����̤�MRO������᥽�åɸƤӽФ���ǽ�Υ����С��إåɤ��ç¤ï¿½ï¿½ï¿½Ê¤ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ê¤¬ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ MutableSequence ���Τ⥯�饹�ʤΤǡ�������Ф��� [T]
�Ƚ񤱤�褦�ˤ��뤿��˥᥿���饹���Ȥ��Ƥ��ޤ���
���Τ���˸��ߤ� typing �����̤Υ᥿���饹�ϥå���ɬ�פȤ����¹Ի������С��إåɤ⤫���ꡢ import typing ���٤��ʤꡢ�ޤ�¾�Υ᥿���饹�Ȥξ��Ͳ��μ�֤�ȯ������Ȥ�������������äƤ��ޤ���
������褹�뤿��ˡ� Python �˼��ε�ǽ���ɲä��ޤ���
- class ʸ�οƥ��饹�ꥹ����ʬ�ˡ� type ���֥������ȤǤϤʤ�
__mro_entries__
�᥽�åɤ���ĥ��֥������Ȥ�񤯤��Ȥ��Ǥ��� __class_getitem__
�᥽�åɤ��������ȡ��᥿���饹��Ȥ�ʤ��Ƥ�MyClass[int]
�Τ褦�˥��饹��ź������񤯤��Ȥ��Ǥ���
�����ε�ǽ�� typing �⥸�塼��ʳ�����Ȥ��ʤ��Ȥ����櫓�ǤϤ���ޤ��󤬡� typing �ʳ������ӤǤ����Ѥ���侩�ˤʤäƤ��ޤ���
�ȤϤ����� __class_getitem__
�ˤĤ��Ƥϡ��Ƕ�Υ᥿���饹��Ȥ�ʤ��Ƥ⥯�饹�ο����񤤤򥫥����ޥ����Ǥ���ή���ź�äƤ��ƹ���Ѵ������Ū���ʤ�ʤΤǡ������˥��饹���֥������Ȥ�ź��������������ɬ�פʾ��̤Ǥ���С�typing �ʳ��ǻȤäƤ��ɤ��󤸤�ʤ����ʡ�
PEP 561 -- Distributing and Packaging Type Information
https://www.python.org/dev/peps/pep-0561/
Typing ���ܳ�Ū�˻Ȥ��Ƥ�������ˤϡ������ɥѡ��ƥ����饤�֥��η������ɤ���ä����ۡ����Ѥ��뤫����ʤ���Фʤ�ޤ��󡣤Ȥ������ȤǤ�����᤿�Τ����� PEP �Ǥ���
PEP 562 -- Module getattr and dir
https://www.python.org/dev/peps/pep-0562/
�⥸�塼��� __getattr__
�ؿ�����������ٱ�����ɤ����ѻ�warning�ʤɤ�¸�������ȤߤǤ���
�ޤ����ٱ�����ɤ����̾�����󶡤��뤿��� __dir__
�����Ѥ��뤳�Ȥ�Ǥ��ޤ���
�Ŀ�Ū�ˤϡ� import asyncio
�ǰ�Ť뼰�� multiprocessing �ޤ� import ����Ƥ���Τ� concurrent.futures.ProcessPoolExecutor ���ٱ�����ɤ��뤳�ȤDz�ä������ȻפäƤ��ޤ���
PEP 565 -- Show DeprecationWarning in main
https://www.python.org/dev/peps/pep-0565/
Python �ˤ��ѻ�ͽ���API�ˤĤ��Ʒٹ𤹤뤿��� DeprecatedWarning ������ޤ����������Python�����ץꥱ�������Υ桼�����ˤȤäƤϤۤ�̵��̣�Ǻ��𤵤����ΤʤΤǡ����ߤϥǥե���Ȥ�ɽ������ʤ��褦�ˤʤäƤ��ޤ���
�������� Python ��ȯ�ԤǤ⤳�ηٹ��Í���ˤ��Ƥ��ʤ��ͤ�¿������ˡ�DeprecationWarning �˵��Ť���ʤ��Ȥ���Ǻ�ޤ���������ȯ�����Ƥ��ޤ���
PEP 565 �Ϥ��ΥХ�󥹤򾯤�����Ĵ��������ƤǤ��� __main__
�⥸�塼��ˤ����Ƥ����� DeprecationWarning ��ǥե���Ȥ�ɽ������褦�ˤ��ޤ���
__main__
�⥸�塼��Ȥϡ����󥿥饯�ƥ��֥������ Python ���󥿥ץ꥿���Ϥ��줿�¹ԥե�����Τ��ȤǤ���������ľ���ѻ�ͽ���API���ƤФ줿�Ȥ����� DeprecationWarning ��ɽ�������褦�ˤʤ�ޤ���
����ˤ�ꡢ��ȯ�Ԥ�API�λȤ�����Ĵ�٤�ʤɤ���Ū�ǥ��󥿥饯�ƥ��֥�������ѻ�ͽ���API��¹Ԥ����Ȥ��� Warning �˵��Ť���褦�ˤʤ�ȴ��ԤǤ��ޤ���
�ȤϤ���������θ��̤ϸ���Ū�ʤΤǡ�Python��ȯ�Ԥ� -Wdefault
���ץ�����Ȥ����� PYTHONWARNINGS=default
�ȴĶ��ѿ������ꤷ�Ƥ����ޤ��礦��
-X dev option
https://docs.python.org/dev/using/cmdline.html#id5
��ǾҲ𤷤� -Wdefault
���ץ����˲ä��ơ� Python ��ĥ�⥸�塼�볫ȯ�Ը����Τ�Τ�ޤ�ơ����Ĥ��γ�ȯ�Ը������ץ�����ޤȤ��Í���ˤ��륪�ץ����Ȥ��� -X dev
���ץ�����ɲä���ޤ�����
�ޤ��� PYTHONDEVMODE=1
�Ȥ����Ķ��ѿ��Ǥ� dev mode ��Í���ˤǤ���褦�ˤʤ�ޤ���
PEP 557 -- Data Classes
https://www.python.org/dev/peps/pep-0557/
���礦�� Qiita �˾Ҳðµ»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¤ï¿½ï¿½Î¤Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
�Ƕ��Python-dev(2017-09)
�Хå��ʥ�С�: 8��� | 6��� | 5��� | 4��� | 3��� | 2��� | 1���
����� Sprint ������ޤ�������ǯ�� Sprint �ϥ١�����ľ�����ä��ΤǤ�������μ���������ޤ����������� Python 3.7 �Υ١�������ǯ�ΤϤ���ʤΤǡ�����ϼ����������(PEP)��¿��Ǥ����ȤƤ������ϾҲ𤷤���ʤ��ʤ��⤽�����������Ƶ������ɤ��Ƥ��ʤ��ˤΤǡ���������ƤˤĤ��Ƥϼ������줿��Τ�����ֶ�Τ�Τ����Ҳ𤷤Ƥ����ޤ���
namedtuple ��������
bpo-28638: Optimize namedtuple() creation time by minimizing use of exec()
namedtuple �Ȥ��������ץ�����Ǥ�������ź���ǤϤʤ�°��̾�ǥ��������Ǥ���褦�ˤ���ǡ�����¤������ޤ��� �㤨�м��Τ褦�ˤ��ƻȤ��ޤ���
_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
�����ưŪ�˥��饹����ΤǤ��������Τ���˥��饹����� Python �����ɤ�ʸ�����ִ����������� eval() ���뤳�Ȥǥ��饹���֥������Ȥ��������Ƥ��ޤ��������Υ᥿�ץ�����ߥ󥰤������ϡ���ե쥯�����Ū�ʵ�ǽ��Ȥäƥ��饹������������⡢�����äƤ���Τ���Ƚ��䤹���Ȥ������åȤ�����ޤ���
���������̾��Python�Υ����ɤϥХ��ȥ����ɤ˥���ѥ��뤵��� pyc �ե�����˥���å��夵���Τ��Ф������������Ǥϥ��饹���������륳���ɤ����٥���ѥ��뤵��Ƥ��ޤ��ޤ������Τ��ᡢ namedtuple �򤿤�����ȤäƤ���⥸�塼����ɤ߹��ߤ��٤��ʤ�ޤ���
�����ǡ�������Ū�� type()
�ؿ���Ȥ������� namedtuple ����ľ����ޤ������ȤϤ������������줿���饹�Υ��󥹥�������®�٤˱ƶ����� __new__
�᥽�åɤ����ϡ���ǽ����Ȥ����˴����ʸ����ߴ�����ݻ��Ǥ��ʤ��ä��Τǡ�1�ؿ������Τ���û�������ɤ��Ф���eval�Ϥޤ��ĤäƤ��ޤ�������Ǥ⡢CPython�Ǥ�PyPy�Ǥ����®���ʤäƤ���Τǡ�namedtuple�򤿤��������Ѥ���饤�֥��򥤥�ݡ��Ȥ�����֤�û�̤���ޤ���
����¾��ʣ���� namedtuple �Ǻ�ä����饹�֤Ƕ�Í�Ǥ�����ʬ��Í����ʤɤκ�Ŭ����������ޤ졢�ʥ��󥹥��󥹤ǤϤʤ��ơ��������줿���饹���֥������ȤΥ�������̤�︺�Ǥ��Ƥ��ޤ���
�ʤ���������������줿���饹�� ._source
�Ȥ���°�������ꡢ eval �оݤˤʤä����饹����Υ����������ɤ����äƤ����ΤǤ���������β��ɤǤʤ��ʤ�ޤ�����
OrderedDict �Υ���ѥ��Ȳ�
��ǯ�䤬 dict �򥳥�ѥ��ȡ������������ݻ���������򤷤��ΤǤ������ޤ� collections �⥸�塼��� OrderedDict �� dict ���̤˥�������������󥯥ꥹ�Ȥ���äƤ��ơ� dict ���ܤΥ�������Ѥ��ޤ���
OrderedDict ��ŵ��Ū�����Ӥ�ñ�� json �ʤɤǽ����ݻ��������Ȥ�����ΤǤ������������Ӥʤ� dict ��Ȥä��ۤ�������������̤�Ⱦʬ�ˤʤꡢ���ۤ������®�Ǥ����������� dict �ν���ϼ�����¸�Ǥ��ꡢCPython��PyPy�Ͻ����ݻ������ΤΡ�����˰�¸����ΤϤ��Ե��������Ǥ���
�����ǡ�OrderedDict��dict���ò¤½¤Î¤Þ¤ï¿½ï¿½ï¿½ï¿½Ñ¤ï¿½ï¿½ï¿½è¤¦ï¿½Ë½ñ¤´ï¿½ï¿½ï¿½ï¿½Æ¸ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¥È¤È¤ï¿½ï¿½Æ¤ï¿½Åµï¿½ï¿½Åªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç½ï¿½ï¿½ï¿½ï¿½ï¿½ì¤³ï¿½ï¿½å¤¬ï¿½Ã¤Æ¤ï¿½ï¿½ï¿½Î¤È¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ì¤ï¿½1/2�ˡ������ƥ����������ɤ�1000�԰ʾ��뤳�Ȥ��Ǥ��ޤ�����
���������ǥ��åȤȤ��� OrderedDict �� dict ��̩��礹��ʺ���ʬΥ����Ƥ��륽���������ɤ�1�Ĥ˥ޡ������Ƥ��ޤ��ˤ��Ȥȡ� OrderedDict ������¸�ߤ��� move_to_end()
�Ȥ����᥽�åɤ�®�٤���������Ƥ��ޤ���¾�ˤ⡢���Ǥΰ�ư���ɲú����ʿ�ѷ׻��̤� O(1) �Τޤޤ�����ɤ⡢�ǰ��׻��̤� O(n) �ˤʤäƤ��ޤ��褦�ʥѥ����������Ƥ����ǽ���⤢��ޤ���
������ʬ�Υ������ѡ��ȤǤ��� Raymond Hettinger �������ç¤ï¿½Ê½ñ¤´ï¿½ï¿½ï¿½ï¿½Ë¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¤Ê¤Î¤Ç¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤Ï¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½á¤ï¿½å¤²ï¿½È¤ï¿½ï¿½Ü¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ú¤ï¿½É¬ï¿½×¤Ç¤ï¿½ï¿½ï¿½Â¿Ê¬ ISUCON ��ˤʤ뤱��ɡ� Python 3.7 �˴֤˹�碌������
PEP 539 v3: A new C API for Thread-Local Storage in CPython
Yamamoto Masayuki ���󤬳�ư����Ƥ���������åɥ������륹�ȥ졼�������Ѥ���C��٥�ο�API����Ƥ���������ޤ�����
��API�Ϥ��ʤ�Ť����餢��ΤǤ�����TLS key �Ȥ��� int ����ȤäƤ��ơ�Linux��᥸�㡼��Unix��Windows�Ǥ�����ʤ���Τ�POSIX�ˤϽ�ò¤·¤Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¤ï¿½ï¿½ï¿½Cygwin�ʤɤ����꤬Í�ä��餷���Ǥ���
PEP 557: Data Classes
��˥ǡ���������ʪ�Ȥʤ뤳�Ȥ���Ū�Ȥ������饹�����ڤ˺���褦�ˤ��뤿���API����Ƥ���Ƥ��ޤ���
@dataclass class InventoryItem: name: str unit_price: float quantity_on_hand: int = 0 def total_cost(self) -> float: return self.unit_price * self.quantity_on_hand
�Τ褦���������ȡ�
def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0) -> None: self.name = name self.unit_price = unit_price self.quantity_on_hand = quantity_on_hand def __repr__(self): return f'InventoryItem(name={self.name!r},unit_price={self.unit_price!r},quantity_on_hand={self.quantity_on_hand!r})'
�Τ褦�ʥ᥽�åɤ���ư����������ޤ���
namedtuple ����Ū����äƤ����ΤΡ� namedtuple �ϥ��ץ�Ǥ��뤿��˰��������Ӥˤϸ����ʤ���������ޤ����㤨�� immutable ���Ȥ������̤Υ��ץ����Ӳ�ǽ�Ǥ���ʤɤǤ���
Data Class �ϥ��ץ�ǤϤʤ������Τ��������Ǥ���Ʊ�����Ǥʤ�Ʊ�����ˤ����Ӳ�ǽ�ˤ��뤫�ɤ����ʤɤ����٤ޤ�����ʸ�� Python 3.6 ����ο����������������Ѥ�����Τǡ��㤨�� namedtuple �����ȼ��Υ᥽�åɤ��ɲä���ˤϤ⤦1�ʷѾ��������饹����ʤɤ����ݤ����ä��ΤǤ�����������Ͼ����� total_cost()
�᥽�åɤΤ褦�����̤˽񤯤��Ȥ��Ǥ��ޤ���
����PEP�ϼ�����������ǡ����ȤϤ⤦̾�����������Ǥ����Ŀ�Ū�ˤ� Record �������ʡ�
PEP 552 -- Deterministic pycs
pyc �ե�����ˤ� py �ե�����Υ����ॹ����פ���Ǽ����Ƥ��ơ� py �ե����뤬���������ȼ�ưŪ�� pyc �ե��������ľ�����褦�ˤʤäƤ��ޤ���
���Τ����py�ե����뤬Ʊ���Ǥ�pyc�ϥХ��ʥ��٥�Ǥϰ��פ��ޤ��󡣤��줬�Ƕ�� �ӥ�ɺƸ���(Reproducible Builds) �Ȥ����ץ饯�ƥ����ˤ��Թ礬�褯����ޤ��� (Debian/Ubuntu �Ǥ� pyc �ϥ��󥹥ȡ����˥ӥ�ɤ���ޤ����� pyc ����˥ѥå������˴ޤ�Ƥ���ǥ����ȥ�ӥ塼�����⤢��ޤ�)
�ޤ���Bazel�Ȥ����ӥ�ɥ����ƥ�Ǥ⤳����Թ礬�����餷���Ǥ���
���� PEP �Ǥϥإå����η������ɲä��������̤�Υ����ॹ����סܼ�ư�ӥ��������¾�ˡ�py�ե�����Υϥå����ͤ���Ļ����Ǥ���褦�ˤʤ�ޤ������ξ�硢 pyc ���ɤ߹���Ȥ��� py �ե�����Υϥå����ͤ�׻����륳���Ȥ����ˤʤ�Ȥ����Ǥ������������إå���py �ե�����Υϥå��������å����Ƽ�ư��ӥ�ɤ��뤫̵���� pyc ��Ȥ��������򤹤�ե饰����äƤ��ޤ���
py�ե����������å����ʤ��������ò¤·¤ï¿½ï¿½ï¿½ï¿½â¡¢ import ���˥����å����ʤ������ǡ����ޥ�ɤ�Ȥä�����Ū�˥����å��������ӥ�ɤ��뤳�ȤϤǤ��ޤ����ʤΤ� root �����ñ¤¹ï¿½ï¿½ï¿½Ê¤ï¿½ï¿½Ç¥ï¿½ï¿½ì¥¯ï¿½È¥ï¿½ï¿½ Python ��饤�֥��ò¥¤¥ó¥¹¥È¡ï¿½ï¿½ë¤¹ï¿½ï¿½ï¿½ï¿½Ê¤É¡ï¿½ï¿½æ¡¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¤ï¿½ï¿½ï¿½ py �ե�������ѹ����������̵����������ʤ��Ǥ��礦��
����PEP��Acceptľ����¾�˰ո����ʤ��ä���Accept������Guido�������ˤǤ����ʤ�������PEP�ϥե�����ե����ޥåȥ�٥�Ǥ����������������ǡ�����ʳ��ˤ� pyc �ե����뤬����ˤʤ�ʤ����������ͳ�ϴ��Ĥ�����ޤ�������������PEP��Accept���줿�Ȥ������Ȥϡ� deterministic pyc �򥵥ݡ��Ȥ���Ȥ�������������ޤä����ȤǤ⤢��Τǡ������̤β���⺣�彤������Ƥ����Ȼפ��ޤ���
��ư��®��
���󥿥ץ꥿�ε�ư��®�����񤷤�����ʤΤǤ������ºݤΥ��ץꥱ�������ε�ư�ǤϤ��β�������ɴ�ܤλ��֤����饤�֥��Υ����ɤ˾��񤵤�Ƥ��ޤ���
����⥸�塼��� import ���Ƥ⡢���Υ⥸�塼��������ε�ǽ��Ȥ��櫓�ǤϤ���ޤ��󡣤��Υ⥸�塼�����ǡ����ޤ�������٤��⤯�ʤ��Ȼפ���ؿ��Ǥ����Ȥ����¸�ط��ϡ��⥸�塼�����Ƭ�ǤϤʤ����δؿ��� import ���뤳�Ȥǡ����ץꥱ�������ε�ư���֤򸺤餹���Ȥ��Ǥ��뤫�⤷��ޤ���
�����ǡ������ PEP 8 ��ȿ�����Τ���ͳ����åȤ����ä����ȿ���Ƥ��ɤ��Ǥ��ˤǤ��������δؿ��μ¹Ի��֤ϼ㴳�٤��ʤäƤ��ޤ��ޤ��������顢�������٤����ʤ������Ĥ����������٤���٤� import ���Ť��⥸�塼��˹ʤäƽñ¤´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¤ï¿½Ç¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
argparse ��ľ�ܡ�����Ū�� import ���Ƥ���⥸�塼�뤬���餵��ޤ�����(�ޡ����Ѥ�) https://github.com/python/cpython/pull/1269
functools �� singledispatch �Ǥ����Ȥ��ʤ��⥸�塼��� singledispatch ��˰�ư���ޤ��� (accept�Ԥ�) https://github.com/python/cpython/pull/3757
uuid �⥸�塼�뤬�� uuid1 �Τ���� libuuid �� UuidCreateSequential ������ɤ���������Ť��ΤǤ�����ٱ䤹����ơ�(���줫���ӥ塼���ޤ�)
https://github.com/python/cpython/pull/3684
�ޤ����Ť� import �򸫤Ĥ��뤿��˻䤬��������ǻȤäƤ��� import �˳ݤ�����֤�ɽ������ѥå��򡢤���Ǥ���ä˥饤�֥���ե졼�����κ�Ԥ��˴�ñ�˻Ȥ���褦�� -X importtime
���ץ����Ȥ�����Ƥ��Ƥ��ޤ������Ϥ��ν��ϥե����ޥåȤˤĤ��Ƽ�ž���֤���ε����򤷤Ƥ��ޤ���
https://github.com/python/cpython/pull/3490
;�̤Ǥ������δ��Ĥ��Υ����ɥѡ��ƥ����饤�֥��� import ���֤�Ĵ�٤Ƶ錄�ꡢ Jinja2 �� import ���������٤����Ȥ˵��Ť��ޤ�����
�¤Ϻ�ǯ�ΤϤ���˥�������̤���Ϥ��Ƥ����Ȥ����� Jinja2 �� Python 3 �Ǥϥ�˥����ɤΥ���ܥ��ʥƥ�ץ졼�ȥ��󥸥�����ѿ�̾�Ȥ��ơ˻Ȥ���褦�ˤ��褦�ȡ�����ܥ�̾�Ȥ���Í����̾����ɽ����������ɽ���ò¤«¤Ê¤ê¶¯ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¡ï¿½Çºï¿½Ã¤Æ¤ï¿½ï¿½ï¿½ï¿½Î¤ò¸«¤Ä¤ï¿½ï¿½ï¿½ï¿½ï¿½ð¤·¤Æ¤ï¿½ï¿½ï¿½ï¿½Î¤Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É½ï¿½ï¿½ï¿½Î¥ï¿½ï¿½ï¿½Ñ¥ï¿½ï¿½ë¤¬ import ���˼¹Ԥ���Ƥ����٤��ä��ΤǤ���
���Ǥ� Jinja2 �γ�ȯ�֥����ǤϤ��ä��ɤ��������ڤ��ؤ�äƤ���Τǡ����� Jinja2 �Υ�꡼����ڤ��ߤˤ��Ƥ��ޤ���
�Ƕ��Python-dev(2017-08)
�Хå��ʥ�С�:
https://docs.python.org/ja/3/
docs.python.org �˸��쥹���å��Υɥ��åץ�����ꥹ�Ȥ��ɲä���ޤ�����docs.python.org �� Fastly ��ȤäƤ���Τǡ� docs.python.jp �����®�˱����Ǥ���Ȼפ��ޤ���
docs.python.jp �ˤ��륻�������ñ�̤ǤαѸ�ɥ�����ȤؤΥ�󥯵�ǽ�ʤɤ��ޤ��ʤ���ñ��������Ǥ���̵���Τǡ������ˤ� docs.python.jp ��ߤ��Ĥ��Ϥ���ޤ��󤬡�����Ū�ˤ� docs.python.jp �� docs.python.org/ja/ �˥�����쥯�Ȥ��뤳�Ȥ�ͤ��Ƥ��ޤ���
PEP 550: Execution Context
Flask �ʤɤΥե졼�����Ǥϥ���åɥ������륹�ȥ졼�������Ѥ��ơ֥���ƥ����ȡפ��ꡢ���ߤΥ桼�����ξ���Ȥ��ꥯ������ID�Ȥ��򤽤��˳�Ǽ�����������ޤ��������� asyncio �ʤɤΥ��롼����ǤϤ��줬�Ȥ��ޤ���
�����ǡ���äȹ��٤���ݲ����줿������ƥ������ѿ��򰷤�����λ��Ȥߤ���Ƥ���Ƥ��ޤ���
Hide implementation details in the C API
�����ɥѡ��ƥ����γ�ĥ�⥸�塼�뤬���Ѥ��Ƥ��� Python/C API ���� Stable ABI �ʳ��ϸ�������������ޥ�����C�ؿ����������äƤ��ơ� Cython �ʤ󤫤������API���Ѷ�Ū�˻Ȥä���ǽ��Ԥ����ꤷ�Ƥ��ޤ���
�����Υǥ��åȤȤ��ơ� Stable ABI �ϻȤ��ˤ����Τ�;��Ȥ��Ƥ��ʤ��Τ��Ф��ơ� API �ϻ����Ȥ��Ƥ���¾�� Python ������ Python/C API �ߴ��� API ���󶡤���ϡ��ɥ뤬�⤯�ʤäƤ��ޤäƤ����ꡢ�տޤ����˼����ܺ٤˰�¸���������ɥѡ��ƥ����Υ饤�֥�꤬�����ƾ������ǽ����Τ���������������ʽñ¤´ï¿½ï¿½ï¿½ï¿½ò¤¹¤ï¿½ï¿½ï¿½Ë¸ß´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ê¤¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤Ã¤Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
�����ǡ� Stable ABI �� #include <Python.h>
�δ֤����롢�������줿 Python/C API ���Ѱդ��褦�Ȥ�����Ƥ�����Ƥ��ޤ���
�Ŀ�Ū�ˤϡ�����ˤ�äƺ��ޤǥޥ������ä�API��C����δؿ��ˤʤꡢRust��Go�ʤ�C����ʳ��θ��줫�� Python/C API ��ƤӽФ��䤹���ʤ뤳�Ȥ˴��Ԥ��Ƥ��ޤ���
PEP 539: A new C API for Thread-Local Storage in CPython
Python �� TLS �Τ���� C API �� pthread_key_t ���90ǯ�夫��� int ���˥��㥹�Ȥ��ƻȤäƤ���ΤǤ���������� posix ���ǤϤ���ޤ��󡣥᥸�㡼�ʴĶ��Ǥ�����ˤʤäƤ��ʤ��ΤǤ����� Cygwin �� CloudABI ������ˤʤäƤ��������Ǥ���
��������ABI��٥�θ����ߴ��������꤬���ꡢ��ñ���Ѥ��뤳�Ȥ�Ǥ��ޤ��󡣤Ȥ������Ȥǿ�����API����Ƥ���Ƥ����ΤǤ������Ƕ� Yamamoto Masayuki (ma8ma)�᤬���� PEP �˺Ƕ����Ȥ�Ǥ��Ƥ⤦����������褷�����Ǥ���
C��٥���ä� Python ����ϸ����ʤ��ΤǤ��������ܿͤγ�������Ǥ�����
�Ƕ��Python-dev(2017-06)
�Хå��ʥ�С�:
PEP 546 -- Backport ssl.MemoryBIO and ssl.SSLObject to Python 2.7
2014ǯ�� Python 2.7 �򥻥��奢�ʾ��֤��ݤĤ��ᡢ���� PEP 466 �ǥ������ƥ���Ϣ�� Python 3.4 �ε�ǽ�� Python 2.7 �˥Хå��ݡ��Ȥ���ޤ���������ˤ� ssl �⥸�塼���ޤޤ�Ƥ��ꡢ Python 2.7.9 ����� TLS �Υۥ��Ȥ�ư�Ǹ��ڤ���褦�ˤʤä��ꥷ���ƥ�ξ����񥹥ȥ������ѤǤ���褦�ˤʤ�ޤ�����
����� PEP 546 �ϡ������ Python 3.5 ���ɲä��줿 ssl.MemoryBIO �� ssl.SSLObject �� Python 2.7 �˥Хå��ݡ��Ȥ����ΤǤ��������� API �����Ѥ���ȡ� socket ���åפ���ΤǤϤʤ��������Υǡ������Ф��� TLS �ν������Ǥ���褦�ˤʤ�ޤ��� Windows �� winsock2 �ǤϤʤ� IOCP ��Ȥä��ꡢ����¾��Ʊ��IO�ե졼������Ȥ��Ȥ��� socket �� TLS ��ʬΥ�Ǥ��뤳�ȤϽ��פǤ���
Python 2.7 ���ΤΥ��Ƥ� 2020 ǯ�˽�λ���ޤ����� pip �� Python 2.7 �Υ��ݡ��Ȥ�λ���������̤��Ǥ����ºݤ˺��ޤǤ⡢pip �ϥ桼�������ۤȤ�ɥ����ˤʤ�ޤǤ��ʤ�Ĺ���ָŤ� Python �򥵥ݡ��Ȥ��Ƥ��ޤ�����
������ pip �� http ���饤����ȤȤ��ƻȤäƤ��� requests �ϡ�������������Ʊ��IO�١����ˤ��Ƥ������Ȥ�Ƥ���Ƥ��ޤ��������� Python 2.7 �Τ��������ʣ���μ�������ƥʥ󥹤��뤳�Ȥˤ�����Ū�Ǥ���
PEP 546 �ˤ�ꡢ pip �� requests �� Python 2.7 �Υ��ݡ��Ȥ������ڤ����Ǥ⡢(��ǯ��Ⱦ�˥�꡼�������) 2.7.14 �ʹߤΤߤΥ��ݡ��Ȥ˸��ꤹ��Ȥ������� requests ����������Ʊ��IO����¸�����;�Ϥ��Ǥ��ޤ���
�ºݤˤ��Υ��ʥꥪ�̤�˿ʤޤʤ���ǽ���⤢�ä��Τǡ�������ɬ�פʤΤ��ɤ�����������Ǯ���ޤ��������Хå��ݡ��Ȥ���Ƥ���Ƥ��륳���ɤΥ�������C��Python��Â���Ƥۤ�ο�ɴ�ԤǤ�������ޤ���
�ǽ�Ū�� Python 2.7 �Υ�꡼���ޥ͡����㡼�� Benjamin Peterson ���󤬡� PEP 466 �ΤȤ��ˤ���API�����ä�����˥Хå��ݡ��Ȥ���Ƥ��������ȿ�Ф��붯����ͳ��̵����͡��Ȥ��ä� Accept ���ޤ�����
PEP 538 warning at startup: please remove it
����ͤ� Accept ���� PEP 538 (C locale �ΤȤ� LC_COLLATE �� C.UTF-8 �ʤɤ˾�ñ¤¤ï¿½ï¿½ï¿½) ��������������ޤ�ޤ�����
���ơ����ο���ǽ�ϡ� locale ���ѹ������������Ȥ��ˤϥ桼�����˺ǽ餫��UTF-8�Υ�����������ꤹ��褦¥������� warning �򡢼��Ԥ����Ȥ��� C locale ��ȤäƤ뤫����ASCIIʸ�������꤬�Ф��Ȥ��� warning ��ɽ�����Ƥ��ޤ�����
������������ warning ��ñ���ݵƫ�����Τȡ��ҥץ�������ư����ɸ�������Ϥ򸫤�褦�ʥƥ��Ȥ����Ĥ��Υޥ��ʡ��ʥץ�åȥե�����Dz���Ƥ��ޤäƥ��Ƥ����ݤˤʤäƤ��ޤ�����
�Ȥ������Ȥǡ��ɤ���� warning ��ǥե���Ȥ�̵���ˤʤ�ޤ������Ķ��ѿ��� PYTHONCOERCECLOCALE=warn
�����ꤷ����Í���ˤʤ�ΤǤ������ޤ�ï��Ȥ�ʤ��Ǥ��礦�͡�
LC_COLLATE ���ѹ����� UTF-8 ��Ȥ���褦�ˤ��Ƥ�����ˤʤ뤳�ȤϤ�ä���̵���Ǥ����� C locale ����ASCIIʸ���ΰ��������¤�����Τ� Python 3.6 ��Ʊ���Dz����������ʤä��櫓��̵���Τǡ� warning ��̵���ʤ뤳�ȤǺ���桼�����ϤۤȤ�ɵ�ʤ���Ƨ��Ǥ��ޤ���
PEP 544 -- Protocols: Structural subtyping (static duck typing)
Python �� typing �⥸�塼��� structural subtyping �Υ��ݡ��Ȥ��ɲä���ޤ�����
��ñ����������ȡ� typing.Protocol
���饹��Ѿ��������饹���������ȡ����줬�ץ��ȥ���ˤʤ�ޤ����ץ��ȥ��륯�饹�Υ᥽�åɤ�Ʊ�������ͥ���Υ᥽�åɤ���ĥ��饹�ϡ����Υץ��ȥ��륯�饹��Ѿ����Ƥ��ʤ��Ƥ⡢��Ū�����å��ϥ��֥��饹��Ƚ�Ǥ���褦�ˤʤ�ޤ���
PEP ����ʬ����䤹�������Ѥ��ޤ���������ϡ��桼��������� Bucket
�� Sized
�� Iterable
���ȷ������å��˶����뤿��˷Ѿ���ȤäƤ��ޤ���
from typing import Sized, Iterable, Iterator class Bucket(Sized, Iterable[int]): ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[int]: ...
PEP 544 ����ǧ�����ȡ� Sized �� Iterable �� Protocol �ˤʤ�Τǡ����� Bucket �ϷѾ��򳰤��Ƥ� Sized
�� Iterable[int]
����ʬ�����ȷ������å���Ƚ�Ǥ���褦�ˤʤ�ޤ���
�Ŀ�Ū�ˤϡ� ABC ��Ѿ�����ȵ�ư���٤��ʤ�ʥ��饹���������٤��ʤ�ˤΤǷѾ����ʤ��Ƥ��ɤ��ʤ�Τϴ򤷤��������ǽ餫�� typing �� ABC ��Ȥ�ʤ��Ǥ��Ƥ��줿���äȷ��̲��Ǥ����Τˤʡ��Ȥ����������⤢��ޤ���
typing �Υ����С��إåɤˤĤ��Ƥ����� Language Summit �Ǥ�����ˤʤä��餷����ML�ʤɤǤ��������Ƥ���Τǡ����줫���Ŭ�����ץ����Ǻ��ʤɤβ�������Ƥ���뤫�⤷��ޤ���
��ư��®��
3���ǾҲ𤷤��ΤǤ�����Python�ε�ư���®�����뤿��Υץ�ꥯ�����Ȥ�2��Ф��Ƥ��ơ����� ��3����˥ޡ������졢�⤦���� �������ޡ������ޤ������ä˸�Ԥ� macOS ��Ǥ���ǽ���夬�����ǡ����꡼�󥤥󥹥ȡ��뤵�줿 Python �ǵ�ư���֤�30ms���餤���ä��Τ�20ms���餤�˸���ޤ���
site
�Ȥ����� (Python �� -S
���ץ�����Ȥ�ʤ��ä��Ȥ���) ��ư���ɤ߹��ޤ��⥸�塼�뤬���ꡢ���줬 sys.path
�Ȥ����饤�֥��� import ����Ȥ���õ�����ʤɤ�������Ƥ��ޤ��� pip �Ȥ� apt-get �Ȥ��ǥ��󥹥ȡ��뤷���⥸�塼�뤬�����˻Ȥ���褦�ˤʤ�ΤϤ��� site �Τ������Ǥ���
���� site
���������Ĥ��Υǥ��쥯�ȥ�ξ�����ꤹ�뤿��� sysconfig
�Ȥ��� Python �δĶ�����򽸤᤿�饤�֥����ɤ߹���Ǥ���ΤǤ��������줬���������Ť��Ǥ��������Ƥ���� macOS �ξ�硢 Framework ��Υǥ��쥯�ȥ�̾ ("Python" ���ä��� "Python3.7" ���ä���) ��Ĵ�٤뤿��� sysconfig ���� _sysconfigdata
�Ȥ����� Makefile
�� pyconfig.h
�������̤��ѿ��򤫤����᤿ dict ����ĥ⥸�塼������Ѥ��Ƥ��ޤ�����
Framework ̾�� sys._framework
������� _sysconfigdata
��ɬ������ʤ���������� sysconfig ����ɬ�פʤ�������ʬ������ site ��˥��ԡ����뤳�Ȥǡ���ư���֤�û�̤����Ǥʤ��� mac �ξ���¿ʬ��ưľ��Υ�������̤�1MB���ٸ��äƤ��ޤ���
�ޤ��� site ����Υ⥸�塼��� import �򸺤餹���Ȥˤ���Ŭ���ϡ����Υ⥸�塼�뤬 functools �ߤ����ˤ褯�Ȥ����ΤǤ���з�ɥ��ץꥱ�������ε�ư���֤ˤϴ�Ϳ���ʤ�����¿���ΤǤ����� sysconfig
��Ȥ��Τ� site
�ʳ��ˤ� pip
�� distutils
�ʤɤΥѥå������󥰴�Ϣ�Υġ����饤�֥������ʤΤǡ�����κ�Ŭ����¿���Υ��ץꥱ�������ε�ư���֡���������̤ˤ⤽�Τޤ޴�Ϳ����Ϥ��Ǥ���
�Ƕ��Python-dev (2017-05)
�Хå��ʥ�С�:
PEP 545 -- Python Documentation Translations
3���ǾҲ𤷤��� Python ���������Ȥ������ɥ�����Ȥ�ۥ��Ȥ�����Ƥ���������ޤ�����
PHP �Υɥ�����ȤΤ褦�˸������ؤ�UI���Ѱդ���ơ����¿���οͤ������������줿�ɥ�����Ȥ˥��������Ǥ���褦�ˤ��Ƥ������Ȥ���ɸ�Ǥ���
docs.python.jp �Ǹ������Ƥ������ܸ����⡢���������ä��� docs.python.org �˰ܴɤ��Ƥ����Ĥ��Ǥ���
PEP 538 -- Coercing the legacy C locale to a UTF-8 based locale
1���ǾҲ𤷤� C locale �ˤ����� UTF-8 ��Ȥ��������ƤǤ��� PEP 538 �� PEP 540 �Ǥ������䤬 BDFL delegate �ˤʤꡢ�轵 PEP 538 ��������ޤ�����
BDFL �Ȥϸ�����ͤˤĤ��Ƥκǽ����긢����� Guido �Τ��ȤʤΤǤ������ºݤˤϤ��٤Ƥ� Guido �����Ƥ���櫓�ǤϤʤ���Ŭ�ڤʿͤ˰Ѿ�����뤳�Ȥ�¿��������� BDFL delegate �ȸƤ�Ǥ��ޤ���
��Ȥ�� PEP 538 �� 540 �ˤ��̤� BDFL delegate �������ΤǤ����������������֤����ʤ��ʤä��Ȥ������Ȥǡ� (PEP 538 �����Ԥ� PEP 540 �����ԤϤդ���Ȥ� Red Hat �οͤʤΤ�) Red Hat ��̵�ط��ʡ������˻��ä��Ƥ�������ASCIIʸ��������Ū�˻ȤäƤ��륳����ȯ�ԤȤ����򱩤���Ω���ޤ�����
PEP 540 �����ԤϤ��Ф餯�̤Τ��Ȥ�˻��������Ƥ���ΤǤ����� PEP 538 �����Ԥ� Nick Coghlan ����ϳ�ȯ�� PEP �򹹿�����Ƥ���Τǡ�����ĥ�äƥ�ӥ塼���ơ��轵���˼������ޤ�����
��ñ�� PEP 538 ��ư�����������ȡ� LC_CTYPE �� C �ΤȤ����Ķ��ѿ� LC_CTYPE �� C.UTF-8, C.utf8, UTF-8 ��3�Ĥ������ꤷ�Ƥ������ǽ�����Ѳ�ǽ���ä�����򤽤Τޤ޻Ȥ��Ȥ�����ΤǤ������������ Python �������Ѥ���¾�Υ饤�֥�� (readline �ʤ�) ��Ķ��ѿ�������Ѥ��ҥץ������Ǥ�ʤ�٤���Ӥ��� UTF-8 �����ѤǤ���褦�ˤʤ�ޤ���
�Ķ��ѿ����ñ¤¤ï¿½ï¿½ï¿½È¤ï¿½ï¿½Ù¹ð¤µ¤ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ñ¤¤Ë¼ï¿½ï¿½Ô¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ C locale �����Ѥ��Ƥ��뤳�Ȥ��Ф���ٹ𤬽��Ϥ���ޤ����ٹ��ä������ͤϡ� locale -a ���ޥ�ɤ����Ѳ�ǽ�ʥ��������Ĵ�٤ơ� LANG �� LC_CTYPE �� C.UTF-8 �� en_US.UTF-8 �ʤɤΥ�����������ꤷ�Ƥ���������
�ޤ����ɤ����Ƥ�ɤ����Ƥ� C locale ��Ȥ�������UTF-8��Ȥ������ʤ��ͤϡ� LC_ALL=C
�����ꤹ��С� C locale �����ѤǤ��ޤ���
�Ť� Linux ���� C.UTF-8 �������뤬���ѤǤ����� LANG=en_US.UTF-8 �� LANG=ja_JP.UTF-8 ���Ƥ��ޤ��� LC_COLLATE �ʤɤ�ƶ�������� sort ���ޥ�ɤʤɤ�ư��Ѥ�äƤ��ޤ��ޤ����� LC_CTYPE �ϥ��󥳡��ǥ��󥰤λ���˻Ȥ��륫�ƥ���ʤΤǡ� LC_CTYPE=ja_JP.UTF-8 �ʤɤ��Ѥ����ꤷ�Ƥ� man �����ܸ�ǥޥ˥奢���ɽ�������� sort ���٤��ʤä��� ls �ν�����Ѥ�ä���Ȥ��ä� C locale �桼���������������Ѥ�ȼ�鷺�ˡ� Python, readline, vim �ʤɤ� UTF-8 �����ѤǤ���褦�ˤʤ�ޤ���
[Python-Dev] Is adding support for os.PathLike an enhancement or bugfix?
Python 3.6 �� os.PathLike �Ȥ������󥿡��ե��������ɲä���� pathlib �����äȻȤ��䤹���ʤä��ΤǤ�����ɸ��饤�֥���API����ˤϤޤ�������б����Ƥ��ʤ��ƥѥ���ʸ������Ϥ��ʤ��Ȥ����ʤ���Τ������餫�ĤäƤ��ޤ���
�̾ 3.6.x �ǤϥХ������Τߤ�ԤäƵ�ǽ�ɲä� 3.7 �ˤʤ�ΤǤ����� PathLike ���ݡ��Ȥ��ɲä� 3.6.x ������Ƥ������ɤ����ˤĤ�������ˤʤ�ޤ����������Ȥ��Ƥϡ��������Х��������� x ���������֤Ϥ����餫 3.7 ����Хå��ݡ��Ȥ���뤳�Ȥˤʤ�ޤ���
PEP 484 (static type hinting) ���
PEP 484 update proposal: annotating decorated declarations
�ؿ��˥ǥ��졼����Ŭ�Ѥ���ȡ������ͥ��㤬�Ѥ���������ޤ���
# �ǥ��졼�ȸ�η��� Callable[[str], ContextManager[DatabaseSession]] @contextmanager def session(url: str) -> Iterator[DatabaseSession]: s = DatabaseSession(url) try: yield s finally: s.close()
���ΤȤ����ǥ��졼�����Τ� type hint ���񤫤�Ƥ����顢��Ū�����å����ϥǥ��졼�Ȥ��줿��η���Ƴ�ФǤ��ޤ���������������񤯤Τϥץ���������Ū�����Τ�������ǤϤʤ����ʹ֤ؤΥɥ�����ȤȤ���¦�̤⤢��ޤ���
Ƴ�и�η���������뤿�����ˡ���ɲä��ơ������̷�⤬�ʤ����Ȥ���Ū�����å�������ǧ�Ǥ���褦�ˤ��褦�Ȥ������Ȥǡ����Τ���ι�ʸ��API��������Ǥ���
PEP 484 proposal: don't default to Optional if argument default is None
���� PEP 484 �Ǥϡ�def handle_employee(e: Employee = None):
�Τ褦�˥ǥե�����ͤ� None ��ȤäƤ����硢 e �η��ϰ���Ū�� Optional[Employee]
�ˤʤ�ޤ���
���ξ�ά��ˡ��¾�Ȱ�������ʤ��ʤɤ���ͳ�Ǥ��褦�Ȥ������Ȥˤʤ�ޤ�����
�����׿��������Ƥ��ޤ��ΤǤ��������������Ū�� Optional[Employee]
�Ƚ񤫤ʤ���Фʤ�ޤ���
����Ū�ʴ�ά��ˡ�� ����Ƶ��� ����뤳�Ȥˤʤꤽ���Ǥ���
PyCon US
PyCon US �����Ť���ޤ����� YouTube�Υ����ͥ��Ǥ��������ư��򸫤뤳�Ȥ��Ǥ��ޤ���
��ϥꥹ�˥󥰤�����DZѸ��ȯɽ�Ϥ��ޤ�����Ǥ��ʤ��ΤǤ����� YouTube �ǻ���򥪥�ˤ���Ȼ��뤬�ְ㤦��ʬ�ʼ�ˤ���ȯɽ�˴ؤ������̤�ñ��ˤȼ�ʬ��ʹ�����ʤ���ʬ�����ޤ꤫�֤�ʤ��Τǡ��ꥹ�˥󥰤η����򤷤ʤ���ȯɽ�򸫤뤳�Ȥ��Ǥ���Τǥ�������Ǥ���
�ޤ��� Language Summit �Ȥ�����������ȯ�Ԥ��濴�˾��Ԥ��줿�ͤ��������ޤ륤�٥�Ȥ� PyCon ����ǹԤ��ޤ����� ���Υ��٥�Ȥ������ LWN.net �DZ������뤳�Ȥ��Ǥ��ޤ�����6/2�ޤǤϥ��֥�����ץ����ɬ�ס�
�㤨�С������ Python 2 ��̿���ˤĤ��ơֺǸ�� Python 2.7 ���꡼���������� EOL�פȽ񤤤��Ф���ʤΤǤ�������ħ�Ȥ�������ɸ�Ȥʤ����դȤ��� 2020ǯ�� PyCon US �Ȥ������Ȥˤʤ�ޤ�����
�ޤ��� CPython ���¤���� GIL ��������¸�Ū�ʥץ��������� "Gilectomy" �ˤĤ��Ƥθ�������Ԥ��ޤ�����
�Ƕ��Python-dev(2017-04)
�Хå��ʥ�С�:
NEWS (changelog) ����
Mercurial���夫��NEWS�ե����� (changelog) �ΰ��������ݤ��ä��ΤǤ�����Github�˰ܹԤ������ȤǤ�ꥳ��եꥯ�Ȥ�������䤹���ʤ����ݤ�����֤�������ޤ����� �ޤ�������եꥯ�Ȥ����˴ְ�ä����֤ǥޡ��������Ȥ������ʤ���̿Ū�ʻ��Τⵯ���äƤ��ޤäƤ��ޤ��� (����ե����� cherry-pick �ˤʤä�����˥ޡ����������򤬹�θ����ʤ��ʤä��Τ�������Ȥ�Mercurial����Git�������ޡ������Х��ʤΤ����ܺ٤��İ����Ƥޤ���)
����ǡ�1�Ĥ��ç¤ï¿½ï¿½NEWS�ե�����˥���ȥ���ɵ����Ƥ�������ˡ�1�ĤΥ���ȥ������ޤྮ�����ե�������ɲä��Ƥ������ġ���Ǥ����Υե����뤫��NEWS�ե����������������ȤߤؤΰܹԤ���̳�Ȥʤꡢ�ġ��������Τ���˥���ڤ��Ԥ��ޤ�����
Generate Misc/NEWS from individual files
����ڤ˻��ä����Τ� reno, towncrier, blurb ��3�ĤǤ���
reno �� OpenStack �ǻȤ��Ƥ���ġ���ǡ�����ȥ�ե�����Υե����ޥåȤ�Yaml���ä���Ȥ���äȥ���������ޤ���
towncrier ���¸�Υġ���ǡ��ե�����γ�ĥ�Ҥ�ǥ��쥯�ȥ�̾��ɬ�פʥ᥿�ǡ��� (��ǽ�ɲä��Х��ե��å������ѥե����ޥ󥹸��夫�ʤ�) ��ɽ������Τǥե��������ȤϤ����Υƥ����Ȥˤʤ�ޤ����ޤ�����������ȥ���ɲä���Τ˥��ޥ�ɤ�Ȥ鷺����˥ե�������ɲä�������ǺѤ�Τ�̥�ϤǤ���NEWS��ӥ�ɤ���Ȥ��� towncrier ��ɬ�פȤ����ΤΡ��׸��Ԥ� towncrier �����Ѥ����˺Ѥफ��Ǥ���
blurb �� Python �Τ���˿����˺��줿�ġ���ǡ� towncrier �� reno �δ֤��餤�Ǥ��� �ǽ�Ū�ˡ� Python �� NEWS �����ɤ����Ƥ�������ˤ��ȼ��Υġ������ƥʥ󥹤�����ͤ�����Ȥ���Ƚ�Ǥ� blurb �����Ф�ޤ�����
PyCon US �ޤǤ˰ܹԤ�λ���������ɸ�ˡ� NEWS����ȥ�ν��������������ɤ��Τǻ������˥����Ȥ��뤿��� reST �Υ����ȷ����ǥ᥿�ǡ����������ʤɡ�������ͤ�Ƥ���Ȥ����Ǥ���
�ץ�ꥯ�����ȤΥ֥����� push --force(-with-lease)
�򤹤�Τ���褦
git �� commit --amend
�� rebase -i origin/master
�������ʿͤ��ޤ���͡��ͤ⹥���Ǥ����Ǥ⡢��ͤ������Ƥ��ʤ��֥����ϤȤ⤫�����ץ�ꥯ�����Ȥ�Ф��Ƥ���֥����� push -f
��ɬ�פ����򤹤�Ȥ��Ϥ褯�ͤ��ޤ��礦��
���Υץ�ꥯ������ ��Ф����ͤ�����ӥ塼�ǻ�Ŧ���줿��ʬ���������Τˤ��θ�ʤ��ʤ���ӥ塼���Ƥ�館�ʤ���ML�ǥ�ӥ塼������ä��ΤǤ������ǽ�˥�ӥ塼�����ͤ���Ŧ���ब������ľ�äƤ�Τ� Github �ǥ�ӥ塼����Τ����ݤ������󤷤ˤ��Ƥ�������쥹���ơ� push -f
����侩�ˤ��褦�Ȥ����äˤʤ�ޤ�����
����å�: Regarding reviewing test cases written for tabnanny module
Github �ܹ����ˤ� Rietvelt ��ȤäƤ����ΤǤ����������ǤϹ׸��Ԥ��������ѥå��򥢥åץ����ɤ����Ȥ�����ӥ塼���ϥѥå����Τ��ӥ塼���뤳�Ȥ⡢���ΥС������Υѥå��Ȥκ�ʬ�������ӥ塼���뤳�Ȥ�Ǥ��ޤ�����
Github ��ץ�ꥯ�����Ȥ� diff ���̤� "Changes from -- Show changes since your last review" �����򤹤�С������ӥ塼�������ߥåȤȥץ�ꥯ�����Ȥκǿ��Υ��ߥåȤκ�ʬ���ӥ塼���뤳�Ȥ��Ǥ��ޤ����Ǥ�������Υץ�ꥯ�����Ȥ����Ԥ� commit --amend
�� rebase -i origin/master
�ǥ��ߥåȤ�ޤȤ�Ƥ��ޤä��褦�ǡ����ε�ǽ���Ȥ��ʤ��ʤäƤ��ޤ��ޤ�����
python/cpython ��ݥ��ȥ�Ǥϥץ�ꥯ�����Ȥ�ޡ�������Ȥ������ѤǤ�����ˡ�� "Squash and merge" �����˸��ꤷ�Ƥ��ޤ����ʤΤǤɤ�����ץ�ꥯ������������򤬱����Ƥ⡢����ϥޡ�������Ȥ��˾ä���Τǵ��ˤ���ɬ�פϤ���ޤ��󡣰����� push --force
��ɬ�פ����ϡ���ӥ塼������ӥ塼���Ƥ������ߥåȤ�ä���;�פ���ô�����䤹����������ޤ���(����� push --force-with-lease
���ץ����Ǥ�Ʊ���Ǥ���)
���η�� Python �ˤ����餺 Github ��DZ��Ѥ���Ƥ��� OSS �˹׸���������٤Ƥ����ƤϤޤ��äǤ����ä� "Squash and merge" �䥳�ߥå�ñ�̤Υ�ӥ塼�ϵ�ǯ�о줷���Ф���ε�ǽ�ʤΤǡ�(���ޤ�)�Τ��� Github �˴���Ƥ���ͤ⤽�����ä���ǽ���Ȥ��ʤ��ʤ�ǥ��åȤˤ��ޤ굤�Ť��Ƥ��ʤ����⤷��ޤ��󡣻�� commit --amend
�� rebase -i origin/master
�򵤷ڤ˻ȤäƤ��ޤ������ä��Τǵ���Ĥ��ޤ���
Python 2 ��̿��
Python 2 �� Python Core Developer �ˤ����ƥʥ󥹤� 2020 ǯ�ǽ�λ���ޤ����������� 2020 ǯ�β�������Ϸ����Ƥ��ޤ���
pythonclock.org �Ȥ��������Ȥ� Python 2 �� EOL ������ȥ����󤬤���Ƥ��ޤ������Ȥꤢ���� 4/1 �Ȳ��ꤷ�Ƥ��ޤ��� Python �γ�ȯ�Ը����Υɥ�����ȤǤ� 1/1 �� EOL date �ˤ��Ƥ��ޤ�����
�������դˤĤ��ƥ��ե�������ͽ��������ʤ����Ȥ������꤬�����夬�ä��ΤǤ����� Python 2.7 �Υ�꡼���ޥ͡����㡼�� Benjamin Peterson ���󤬺Ǹ�� Python 2.7 ���꡼���������� EOL �Ȥ������Ȥ���������դϷ����ޤ���Ǥ�����
PyCharm�ΥǥХå���40�ܹ�®��
PyCharm debugger became 40x faster on Python 3.6 thanks to PEP 523
PyCharm ������ Blog ���� ���� ML �ǾҲ𤵤�ޤ����� PyCharm 2017.1 & Python 3.6 �δĶ��ǥǥХå�������30��®���ʤä��褦�Ǥ���
Python ɸ��ΥǥХå� (pdb�Ȥ�����쥤�䡼��bdb) �ϡ� Python ���󶡤��Ƥ���ȥ졼���󥰵�ǽ��ȤäƤ��ޤ����������ԥ�����Хå����ƤФ�Ƥ�����ǥ֥졼���ݥ���Ȥ��ɤ�����Ƚ���ԤäƤ���Τǡ����ʤꥪ���С��إåɤ��ç¤ï¿½ï¿½ï¿½Ê¤ï¿½Þ¤ï¿½ï¿½ï¿½
���ơ�Python 3.6 ����Ω���ʤ�����ǽ�Ȥ��ơ��������� CPython �˥ѥå������Ƥ뤳�Ȥʤ� JIT ���ɲäǤ���褦�ˤ��뤳�Ȥ���Ū�ˤ��ơ��ե졼���ɾ������ؿ����֤���������褦��API���ɲä���ޤ���������� Microsoft �� Pyjion �Ȥ��� Python �� JIT ���ɲä���ץ��������Ȥ������ƤǤ���
PyCharm �Ϥ��ο���ǽ��Ȥ����֥졼���ݥ���Ȥ����ꤹ��Ȥ��˥Х��ȥ����ɤ������������ΥǥХå���ȯ���뤳�ȤǤ��Υ��ԡ��ɥ��åפ�¸������褦�Ǥ���
���������ɤ���� pdb ���٤����֤θ����ϥѥե����ޥ󥹤��ç¤ï¿½ï¿½ï¿½Æ¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¬ï¿½ï¿½ Python �ǽñ¤«¤ï¿½Æ¤ï¿½ï¿½ë¤«ï¿½ï¿½Î¤è¤¦ï¿½Ç¡ï¿½ trace �١����Τޤ������ʥ��ԡ��ɥ��åפ�¸����Ƥ��� pdb-clone �Ȥ����ץ��������Ȥ�ML�ǾҲ𤵤�Ƥ��ޤ�����
���Ƥ��������� API ����Ƥ��Ƥ��줿 Microsoft �ȡ�����API�����Ѥ�����®�ǥХå�����ѥ�٥�˻��äƤ��ä� JetBrains �ϥ��å���֤Ǥ���
Python 3.6.1 �ˤ�����Х��ʥ�ߴ�������
Python 3.6.1 �ǥӥ�ɤ�����ĥ�⥸�塼�뤬 3.6.0 �����ѤǤ��ʤ��Ȥ����ߴ��������꤬ȯ�����Ƥ��ޤ��ޤ�����
What version is an extension module binary compatible with
���ˤʤä��Τ� bpo-27867 �ǡ� __index__
�Ȥ����ü�᥽�åɤ��Ѥ��뤳�Ȥǥ����԰����ʥ����ɤ��񤱤�Ȥ�������Ǥ��� (Python �� ctypes ��Ȥ����ʤɤ���������̤ϥ�������ˤʤ�褦�ˤȤ����ؿˤdz�ȯ����Ƥ��ޤ���)
�������������������ǡ� PySlice_GetIndicesEx()
�Ȥ�������API�μ����� _PySlice_Unpack()
, _PySlice_AdjustIndices()
�Ȥ�������API��ʬ�򤵤줿��ǡ� Py_LIMITED_API
�Ȥ����ޥ������������Ƥ��ʤ��Ȥ��� PySlice_GetIndicesEx()
�Ȥ���Ʊ̾�Υޥ�����API�ؿ���ʤ�äơ����Υޥ���������API��ľ�ܸƤ֤��ȤǸƤӽФ��Υ����С��إåɤ��︺�������ˤʤ�ޤ�����
�Ȥ����������� Py_LIMITED_API
�Ȥ����ޥ��������� Python 3.4 �� 3.6 �Τ褦�ʥޥ��ʡ��С�����󤬰㤦 CPython �Ǹߴ����Τ���API, ABI�����Ѥ��뤿������Ѥ�����Τǡ�¿���Υ饤�֥��γ�ĥ�⥸�塼��Ϥ��Υޥ�����Ȥ鷺�� 3.6.0 �� 3.6.1 �Τ褦�ʥޥ������С������Ǥθߴ�������Ԥ��Ƥ��ޤ���
Python 3.6.1 �� PySlice_GetIndicesEx
��Ȥä���ĥ�⥸�塼���ӥ�ɤ���ȡ� 3.6.1 ���ɲä��줿 _PySlice_Unpack
, _PySlice_AdjustIndices
�򻲾Ȥ��Ƥ��ޤ��Τǡ� 3.6.0 �Ǥϥ����ɤǤ��ʤ��ʤäƤ��ޤ��ޤ���
binary wheel �����ۤ��Ƥ���饤�֥��γ�ȯ�Ԥϡ����̤��к��Ȥ��ơ����Τ褦�ˤ��ƥޥ����ò¥¥ï¿½ó¥»¥ë¤¹ï¿½ï¿½ï¿½ 3.6.0 �Ǥ� 3.6.1 �Ǥ�¸�ߤ���ؿ���ľ�ܸƤӽФ���Ϥ��Ǥ��� (�ޤ��� 3.6.0 �ǥӥ�ɤ���Ȥ�����⤢��ޤ�)
#ifdef PySlice_GetIndicesEx #undef PySlice_GetIndicesEx #endif
�ʤ����ޤ����1������Ȥ������Ȥ⤢�ꡢ���ΤȤ��� 3.6.2 �ζ۵ޥ�꡼��ͽ��Ϥ���ޤ���
Python 3.6 �� set �Υ��������̤Υꥰ��å����
Program uses twice as much memory in Python 3.6 than in Python 3.5
���륢�ץꥱ�������� Python 3.6 �Υ�������̤� 3.5 ��2�ܤˤʤ�Ȥ�����𤬤���ޤ����� 3.5 ���� ���꤬32GB �Υޥ�������̤˽����������� 3.6 ���ȥ���åפ�Ȥ������ƿ����ܻ��֤�������Ȥ����ΤǤ���
�Ƹ������ɤ� OpenCL �ʤ��ͤ����ѷи��Τʤ���¸�ط���¿�����Ƹ�����Τ�32GB��RAM��褻���ޥ���ɬ�פǡ�1��μ¹Ԥ�30ʬ�ʾ夫���ꡢ�����⥢�ץꥱ�������ϥ⥸�塼���ưŪ�����Ѥ�����ˤʤäƤ��ƥ��������פ�grep�ǥ��������ɤ��Τ����ݤȤ����������ä��Τǡ��ۤ�1�������������βս�����ꤷ�ޤ�����
���ʤߤˡ�����ޤ���ޤ��˥������Ĥ��뤿��˻Ȥä���ˡ�ϡ����Υץ������κǽ���̥���åɤ�ư�������Υ���åɤ�30�ä˰���������� (����� swap �������Τ� getrusage(2)
�ǤϤʤ� /proc/self/status
�� VmRSS
�� VmSwap
�򻲾Ȥ��ޤ���) �ȥ����å��ȥ졼����ɽ������Ȥ�����ΤǤ�������ǥ��ץꥱ�������ι������Ф���ͽ���μ����ۤܥ����ξ��֤Ǥ⡢�ץ������Τɤ���ʬ��¹Ԥ���Ȥ��ˤɤ줯�餤��������̤������Ƥ���Τ�����ޤ����İ����뤳�Ȥ��Ǥ��ޤ�����
��̤Ȥ��� �� set (�ޤ��� forzenset) �Υ��󥹥ȥ饯�������� set (�ޤ��� frozenset) ���Ϥ����Ȥ��ˡ����� set �Υ�������̤������Ƥ��ޤäƤ��뤳�Ȥ�ʬ����ޤ����� bpo-29949
set �Υ����ɤ���������Ȥ��˥ߥ������ꡢ set.add(x)
�����Ǥ��ɲä���Ȥ��������ǵ�����ꥵ������set.add()
�������֤��ƤФ���ǽ��������Τǡ��ϥå���ơ��֥뤬���ʤ�;͵���ä��ç¤ï¿½ï¿½ï¿½Ë¥ê¥µï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤ï¿½Æ±ï¿½ï¿½ï¿½×»ï¿½ï¿½ï¿½ set �ò¥³¥Ô¡ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ì¤ï¿½ï¿½Û¤ï¿½ï¿½Ü¤Ë¤Ê¤ï¿½È¤ï¿½ï¿½ï¿½ï¿½ê¥°ï¿½ï¿½Ã¥ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ 3.6 �֥����ǽ����ѤߤʤΤ� 3.6.2 ��ľ��Ϥ��Ǥ���
Python 3.6.1 (default, Mar 23 2017, 16:39:01) [GCC 6.2.0 20161005] on linux >>> import sys >>> s = set(range(10)) >>> sys.getsizeof(s) 736 >>> t = set(s) >>> sys.getsizeof(t) 1248 # Ʊ�� set �ʤΤ���1.7��!
æ���Ǥ���Ʀ�μ���Ҳ𤷤Ƥ����ޤ��� dict ��1����ȥ�� key �� value ��2�ͤòµ²ï¿½ï¿½ï¿½ï¿½ï¿½Î¤ï¿½ï¿½Ð¤ï¿½ï¿½ï¿½ set ��1����ȥ�1�ͤʤΤǡ�Ʊ�����ǿ��ʤ� set �������ʥ���ˤʤꤽ���˻פ��ޤ���͡��¤� Python 3.6 �Ǥϡʤ��Υꥰ��å�����ȴ���ˤ��Ƥ�˥�������̤ϵ�ž���Ƥ��ޤ���
>>> d = dict.fromkeys(range(10)) >>> sys.getsizeof(d) 368 # set(range(10)) ����٤�Ⱦʬ!
����ϼ��Τ褦����ͳ�Ǥ���
- �ϥå����ͤ�ϥå���ơ��֥�Υ���ȥ�˳�Ǽ���Ƥ���Τǡ� 1����ȥꤢ������ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ 2 : 1 �ǤϤʤ� 3 : 2
- ������ compact orderd dict �����Ѥ���� dict �Υ�������̤��� 2/3 �ˤʤäƤ���Τǡ��ϥå���ơ��֥���ç¤ï¿½ï¿½ï¿½ï¿½Æ±ï¿½ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ì¤ï¿½Æ±ï¿½ï¿½
- ����� set ������ dict ������ϥå���ơ��֥�ò¥¢¥ï¿½ï¿½ï¿½Ã¥ï¿½ï¿½Ö¤ï¿½ï¿½ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¤Ç¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ì¤ï¿½ï¿½ï¿½Å¾ï¿½ï¿½ï¿½ï¿½
�ϥå���ơ��֥�Υ������˴ؤ��� dict �� set �����ˤ��ۤʤ�Τˤ���ͳ������ޤ���dict ��̾�����֤Ȥ������Ѥ����ΤǸ������ҥåȤ��뤳�Ȥ�¿���Τ��Ф��� set �Ͻ���黻�Ȥ������Ѥ����Τǥߥ��ҥåȤ�¿���������ν����٤� dict ����⤯�ʤ�ޤ����ϥå���ơ��֥뤫��θ������ҥåȤ�����Ͼ��ͥ��������ʿ��Ĺ��Ⱦʬ��õ�������Ȥδ����ͤˤʤ�ޤ������ߥ��ҥåȤ���Ȥ��Ͼ��ͥ��������Ĺ���������ͤˤʤ�Τǡ����ä���ȸ����о��ͤΥ����Ȥ��ܤˤʤ�ΤǤ������Τ��ᡢ�����ͤò¸º¤é¤½ï¿½ï¿½ï¿½ï¿½ set �ϥϥå���ơ��֥�ò¥¢¥ï¿½ï¿½ï¿½Ã¥ï¿½ï¿½Ö¤ï¿½ï¿½ç¤ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½Î¤Ç¤ï¿½ï¿½ï¿½
�ϥå���ơ��֥��̩�٤��㤤�Ȥ������Ȥϡ�compact ordered dict ��Ʊ����������Ѥ���оʥ��경�Ǥ���;�Ϥ��ç¤ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤Ç¤â¤¢ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¥ê¥°ï¿½ï¿½Ã¥ï¿½ï¿½ï¿½ï¿½Î·ï¿½Ç¥ê¥°ï¿½ï¿½Ã¥ï¿½ï¿½ï¿½ï¿½Ê³ï¿½ï¿½ï¿½ï¿½ï¿½Ê¬ï¿½Ë¤Ä¤ï¿½ï¿½Æ¤ï¿½Ï¥Ã¥ï¿½ï¿½ï¿½Æ¡ï¿½ï¿½Ö¥ï¿½Î¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¥Ð¥ï¿½ó¥¹¤Ë¤Ä¤ï¿½ï¿½Æ¤ï¿½ï¿½ì¤³ï¿½ï¿½Õ¸ï¿½ï¿½ï¿½ï¿½ï¿½Ã¤Æ¡ï¿½set���ͤ�Raymond����ˡֲ��ˤ�ä���ͤ�����֤ò¤¯¤ï¿½×¤ï¿½Å£ï¿½ò¤µ¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤Ã¤ï¿½ï¿½Î¤Ç¡ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Æ¤ß¤Þ¤ï¿½ï¿½ï¿½
@metahne
�Ƕ�� Python-dev (2017-03)
�Хå��ʥ�С�:
Python 3.6.1rc1
Python 3.6.1rc1 ����꡼������ޤ������ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ê¤¬ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ 3.6.1 �� 3/20 �˥�꡼�������ͽ��Ǥ���
3.6.1 �� Github �˰ܹԤ��Ƥ�����ƤΥ�꡼���ˤʤ�ޤ����ʤˤ����꤬�ʤ�����ǧ���뤿��ˡ����Ĥ��RC�ǰʾ�˥������������Х��ʥ����ξ��������ʪ�Υƥ��Ȥ�ɬ�פʤΤǡ���ǽ�����϶��Ϥ򤪴ꤤ���ޤ���
Github �ܹԸ�����
�ʹߤ���1����Ф��ޤ�������ȯ�Ԥ���Υե����ɥХå��Ϥ�����͹�ɾ�Ǥ�����ϡ����ڤ˥ץ�ꥯ�����Ȥ򤯤줿�ͤ�CLA�˥����󤷤ʤ��ޤ����֤������̤Υޡ����Ǥ��ʤ��ץ�ꥯ�����Ȥ����ޤ뤳�Ȥ��ǰ���Ƥ����ΤǤ��������ޤǤΤΤȤ������������פ����Ǥ���
������ Misc/NEWS �Ȥ��������� changelog �ˤ�����ե����뤬���ˤ˥���եꥯ�Ȥ򵯤����Ƥ��Ʋ�褹�뿷�ġ��뤬��ȯ����ä��ꡢ�ץ�ꥯ�����Ȥ�ޡ�������Ȥ��Υ��ߥåȥ����Υե����ޥåȤʤɤ��ä��礤�ǥ롼���ޤä����ɤޤ��ɥ�����Ȳ�����Ƥʤ��� Github �Υǥե���ȤΤޤޥޡ�������륱������¿���Ȥ����٤�������Ϥޤ��ޤ�³���Ƥ��ޤ���
�ޤ���Travis-CI �ǤΥƥ��Ȥ�ѥ����뤳�Ȥ�ޡ����ܥ���ò²¡¤ï¿½ï¿½Î¤ï¿½É¬ï¿½Ü¤ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½Î¤Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ì¤¬ï¿½è¤¯ï¿½Ù±ä¤¹ï¿½ï¿½ï¿½ï¿½ï¿½ê¤¬ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã±ï¿½Ê½ï¿½ï¿½ï¿½ï¿½Î¥Ð¥Ã¥ï¿½ï¿½Ý¡ï¿½ï¿½È¤Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô¤Ã¤Æ¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Travis-CI �� (���Ĥ��� Python ��Ϣ organization ��Í��) ����25job�������ƤƤ��äƤ��Ƥ���ʾ��˾��ʤ����ɤ줫�ƥ��Ȥ��������Ȥ����ä��礤�ò¤·¤Æ¤ï¿½ï¿½ï¿½ï¿½é¡¢ï¿½Ö¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½25job�η���������ƥ��١��Ȥ��줿���顣�פȤ����ñ¤¹ï¿½ï¿½ß¤ï¿½ï¿½ï¿½ï¿½ê¡¢ï¿½ÂºÝ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½ Travis-CI �Υƥ��Ȥϲ�Ŭ�ˤʤ�ޤ������ޤ������ƥ��١��Ȥ���Ƥʤ��ä��ʤ��ï���Τ�ʤ��ä���ĤȤϤ��� Travis-CI ����ˤ�100���δ��դ�
CPython 3.7 is now faster than CPython 2.7 on most benchmarks
������ʥ��ץ�򽸤᤿�٥���ޡ����� Python 2.7 �� 3.5 ����٤�����®���ʤäƤ�Τ��٤��ʤäƤ�Τ�Ⱦ�����餤���ä��ΤǤ����� Python 3.6 �䤽��ʹߤι�®���ˤ�äƤ������� Python 3 ������®���ȶ���ĥ�äƸ����봶���ˤʤäƤ��ޤ���������Ū�ˤ�10%�ʾ��٤��ʤä��٥����12����Ф��ơ�10%�ʾ�®���ʤä��٥����23�濫��ޤ���
���ʤߤ��٤��ʤäƤ�٥���Υȥå�2�� Python ���ޥ�ɤε�ư (`-S` ���ץ���󤢤�ʤ���2����) �Ǥ����㤨�� Python 2 �Ǥ��Ȥ߹��ߤ� open
�ؿ��� C ����� FILE*
���åפ������֥������Ȥ��֤��Ƥ��ơ������� Python ���󥿥ץ꥿��Ǽ�������Ƥ����ΤǤ����� Python 3 �Ǥ� FILE*
���Ȥ��ʤ��ʤ������ io
�⥸�塼�뤬���Ѥ����褦�ˤʤä����ᡢ��ư���� io
�⥸�塼��Ȥ��ΰ�¸�⥸�塼�뤬����ݡ��Ȥ����褦�ˤʤäƤ���Τ��٤��ʤäƤ븶����1�ĤǤ���
��ư���٤��ʤä��ȸ��äƤ���ߥ��äǤ�������ư���˥���ݡ��Ȥ����⥸�塼����������٤��⤤�⥸�塼��ʤΤǡ� Python ���Τε�ư���٤��ʤäƤ��Ƥ� Python �ǽ񤫤줿���ץ�ε�ư���֤ˤϡʷ�ɥ��ץ꤬���Υ⥸�塼��򥤥�ݡ��Ȥ����ǽ�����⤤����ˡ˱ƶ����ʤ����Ȥ�¿���Ϥ��Ǥ���
�ȤϤ�����ư��1�ߥ��äǤ��ᤤ�˱ۤ������Ȥ�̵���Ǥ����������¤� vim �ץ饰�����Í̾������ Python �ε�ư�� (�ä� Lua ����٤�) �٤��ȶ��Ԥò¤³¤Ü¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½Î¤ï¿½ Twitter �Ǹ��뵡���褯���ä��Τǡ� ���ƥʥ󥹥����ȤȤΥХ�󥹤���줿�ϰϤǤκ�Ŭ�� �ò¤·¤Æ¤ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½
PEP 543 -- A Unified TLS API for Python
Python �ˤ��Τ��� ssl �Ȥ���ɸ��饤�֥�꤬����ΤǤ���������� OpenSSL �� Python ����Ȥ�����Τ�ΤǤ���
�Ƕ�ϰ���TLS�ν������������Ƥ���ΤǤ����� Windows �ʤɤ� OpenSSL ��Х�ɥ뤷�����ۤ��Ƥ�Ķ��� OpenSSL �Υ������ƥ������åץǡ��Ȥ����ۤ���ɬ�פ��ФƤ��Ƥ��ޤ��ޤ��� macOS �Ǥ⡢ Apple �������ƥ�� OpenSSL �� deprecate ���Ƥ��ޤäƤ⤦�����ȥ��Ƥ��Ƥ���Ƥʤ��Τǡ� Windows ��Ʊ�����꤬ȯ�����Ƥ��ޤ��� (PyPI �� CDN �� fastly ��ȤäƤ���ط��ǡ� macOS �Υ����ƥ�� OpenSSL ���б����Ƥʤ� TLS v1.3 ��ɬ�ܤˤʤ�Ȥ������祤�٥�Ȥ�Ƕᤢ��ޤ�����)
OpenSSL ����� macOS �Ǥ� SecureTransport, Windows �Ǥ� SChannel ��Ȥ��С� OpenSSL �˰�¸�����ˡ� Apple �� Microsoft �����ƥʥ󥹤��Ƥ���Ƥ�������񥹥ȥ���TLS������Ȥ����Ȥ��Ǥ��ޤ����ޤ��Ƕ�� OpenSSL �ʳ��μ���Ū��TLS �����������Ƥ��Ƥ��ޤ��� OpenSSL �˰�¸�����˴�ñ�� TLS ��Ȥ���褦�ʻ��Ȥߤ������¿���οͤ������ˤʤ�ޤ���
������Ƥ��줿 PEP 543 �ϡ����ΤϤ���ΰ���Ȥ��ơ�TLS�Υ饤�֥�꤬��������٤�ɸ���API��������ơ� ssl �⥸�塼��ˤ��� API �����������Ȥ�����ΤǤ������줬�Ǥ���С�Ʊ��API�˽�򤷤� SChannel ���åפ���ʤɤ��̼����⥸�塼��� PyPI �����ۤ���TLS�����Ѥ���饤�֥��� ssl �ȥ����ɥѡ��ƥ��饤�֥��δ֤ǥ����å����䤹���ʤ�Ϥ��Ǥ���
��ƤϤ��줿��ΤΡ��ºݤ˼��������Ѥ��뤳�Ȥʤ�������ӥ塼���Ƶ����Ǥ���ͤ����ʤ��Τǡ��Ū�˼����������������ʤ��������Ф������ǿʤ�Ǥ���Ϥ��Ǥ���
¿ʬ���줬 Python 3.7 �ǰ��ֽ��פʿ���ǽ�ˤʤ�󤸤�ʤ����ʡ�
Translated Python documentation
Python �Υɥ�����Ȥ����������ֿʤ�Ǥ���Τ����ͤ⻲�ä��Ƥ������ܸ����ʸŤ� Python �� changelog �Ȥ���ĥ��񤯿ͤ���ɬ�פȤ��ʤ� Python/C API�Υɥ�����Ȥ������ޤ��85%�ʾ塪�ˤǡ������������ʤ�Ǥ���Τ��ե�󥹸������Ψ��10%������ɥ��塼�ȥꥢ��ϥ��С�����Ƥ���ˤǤ���
����ʥե�󥹸�������򤵤�Ƥ��� Julien Palard ���󤬡� docs.python.org/<lang>/
�۲��������ɥ�����Ȥ�����Ǥ���褦�ˤ������� ��ǯ python-ideas ML����Ƥ��Ƥ������ͤ������δ�������ư�ӥ�ɡ��ۥ��ƥ��󥰤ʤ󤫤β������̲������¾�θ���Ǥ��ä����������䤹���ʤ�������ʤȻפäƱ��礷�Ƥ��ޤ���
���ơ� Python �Υɥ�����Ȥ� Sphinx �Ȥ����ġ���ǹ��ۤ���Ƥ��ꡢ������ Sphinx �����ĵ�ǽ��ȤäƤ��ޤ�������Ū�ˤ� Sphinx ����ʸ��ѥ饰������ʬ���� gettext �� POT �����ǽ��Ϥ����ꡢ���Υѥ饰��դ��б���������ʸ�� mo �����Υե����뤫���ɤ߹���DZ�ʸ�Ⱥ����ؤ��뤳�Ȥǡ�¾�� gettext ��Ȥä�OSS��Ʊ���褦�ʼ����������Ǥ���褦�ˤʤäƤ��ޤ���
�ܲȤΥɥ�����ȤϤ�����󤳤ε�ǽ��Ȥ鷺�˹��ۤ���Ƥ���ΤǤ��������ε�ǽ��Ȥ������꤬�Ф���ʬ�����ꡢ���ܸ�ץ��������ȤǤ� fork �˽��������Ƥ����֤����Ѥ��Ƥ��ޤ������Ĥ��ν��������ܸ�ʳ��θ���������Ǥⶦ�̤���ɬ�פʤ�ΤǤ����Ȥ������Ȥ��ܲȤǽ�������ץ�ꥯ�����Ȥ��ä��ΤǤ������ɥ����������������Ū�ʥ��С����� Reject ����Ƥ��ޤ��ޤ������������θ� Victor Stinner ����(����1ǯ�Ǥϥ���ȥĤǥȥåפΥ��ߥå���) �� Accept ���Ƥ���ơ�������2��1�ˤʤ�ޤ�����
����ޡ����ܥ���򲡤��Ƥ⤤�������ǤϤ����ΤΡ��̤˵ޤ�ɬ�פϤʤ����ͻҸ������ä��֤����顢 Victor ���󤬤���ˡ�������ٱ礷�褦���פäƤ����᡼��� Python-Dev ����Ƥ��Ƥ��졢¿���λ�Ʊ�Υ쥹�������ޤ����� Victor ����ޥ��������
����ʤ���ʤǡ�����Υץ�ꥯ�����Ȥϥޡ������ޤ��������줫��� Julien ����ã�ȶ��Ϥ��ơ���ʩ�ʳ��� Python ���ߥ�˥ƥ��οͤ��������䤹�����Ȥߤ��äƤ�������ʤȻפ��ޤ���
���ʤߤˡ����� Python �Υɥ������������ Transifex �Ȥ��������� (OSS������̵���ץ�󤢤�) �ǹԤäƤ���ΤǤ���������Τ��Ȥ�ͤ��� Red Hat ����äƤ��� Zanata ���Ƥߤޤ����� Transifex �����äƤ�����פʵ�ǽ�Ϥۤܥ��С����Ƥ��뤷�� Transifex �ˤ�̵���С������ǽ������ʸ�ΥС�������������ʤ��ơ�Ʊ���ץ��������Ȥθ�ʸ��ʣ���С��������Ƥ�ˤ����ä��ꡢ���ݡ��ȤΥ쥹�ݥ󥹤⤹�����᤯���ɤ��ä��Ǥ��� �ޤ��� gettext ���η����ǤϤʤ� Web �����Ȥ� WYSIWYG ����������ʤ顢 Mozilla �� Pontoon ���ɤ������Ǥ����� ���� OSS �������ץ��������Ȥ�Ϥ�褦�Ȥ���Ƥ������ϻ��ͤˤ��Ƥ���������
@methane
�Ƕ�� Python-dev (2017-02)
�Хå��ʥ�С�:
������������ȯ��
��˥ɥ�����Ȥβ����ˤĤ��Ʒ�³Ū�˳�ư����Ƥ��뤳�Ȥ�ɾ������ơ� Mariatta ���󤬥�����ȯ�Ԥ˲ä��ޤ�����
�ͤ��ç¤ï¿½Ê¥Ñ¥Ã¥ï¿½ï¿½ï¿½ï¿½ï¿½Î©ï¿½Ã¤Æ¥ï¿½ï¿½ï¿½ï¿½ï¿½È¯ï¿½Ô¤Ë¤Ê¤Ã¤Æ¤ï¿½ï¿½Þ¤Ã¤ï¿½ï¿½Î¤Ç¡ï¿½ï¿½ï¿½ï¿½ï¿½Blog���ɼԤ˴ְ�ä����ݤ�Ϳ���Ƥ��ޤ�ʤ��褦�˶�Ĵ���Ƥ��������ΤǤ�����������ȯ�Ԥ˽��פʤΤ�¾�Υ�����ȯ�Ԥȶ�Ĵ���ƥ롼����äƹ׸����뤳�ȤǤ���
��������ñ�ʽ�����¾�ͤ� pull request �Υ�ӥ塼�ʤɤǤ⡢��³Ū�˥�����ȯ�ԤȤ��Ȥꤹ�뵡�񤬤���С��빽��ñ�˥�����ȯ�Ԥˤʤ��Ϥ��Ǥ��� ��Ҥ��� Github �ܹԤˤ�ä��ߵ郎�����ä��Ϥ��ʤΤǡ����ε������ɤ�Ǥ������äƤ������⤼�����äƤߤƤ���������
Github �ܹ�
2/11 (����ꥫ���֤ʤΤ����ܤǤ�2/12)�ˡ�Python �Υ�ݥ��ȥ꤬ https://github.com/python/cpython �˰ܹԤ��ޤ�����
������ mercurial �����Ѥ��Ƥ����Τǥ�ݥ��ȥ���Ѵ���ɬ�פˤʤ�ΤǤ��������� python/cpython �ˤ��ä��ߥ顼�Ȥ���ʪ�ǥ��ߥåȤΥϥå��夬�Ѥ�ä��Τǡ��ߥ顼�����Ѥ��Ƥ����ͤ����դ�ɬ�פǤ��� �ߥ顼��ݥ��ȥ�� python/cpython-mirror �˰�ư���ޤ�����������������뤫�⤷��ޤ���
���ޤǥ��ߥåȥ����� "Issue #12345: " �ǻϤޤäƤ����ΤǤ��������� #12345
�Ͼ��� Github �ˤ����ֹ�Υץ�ꥯ�����Ȥ�����Ƥ��󥯤���ʤ��餷���Ǥ��� Github ���餤�Ǥ��͡�
����Υ��ߥåȤǤ� bugs.python.org �� issue �򻲾Ȥ���Ȥ��� "bpo-12345" �Τ褦�˽񤯤��Ȥˤʤ�ޤ��� Github �� pull request �򻲾Ȥ���Ȥ��� #1234
�ǤϤʤ� GH-1234
���侩����ޤ����ʤ���Ǥ������ Github �Ǽ�ư��󥯤���ޤ���
�ȡ������ޤǤ��ɤ���Ǥ����� issue �ȥ�å����� Github �����֤��Ƥ�¾�Υץ��������Ȥηи��Ԥ�Greasemonkey�Ȥä� bpo-12345 ���󥯲�����褦�ˤ������������衼���Ȥ������꤬ȯŸ���ơ���ݥ��ȥ��Ѵ����˲��Υ��ߥåȥ����� (Issue|issue) #12345
�� bpo-12345
���Ѵ����褦�Ȥ����ä��ޥ����졼�����η�Կ�����������夬�äƤ��ޤ��ޤ�����
�ͤ�ľ���ˤ�����ѹ������ΤϤ��ꤨ�ʤ��Ȼפäƥ��ߥåȥ����ñ¤´ï¿½ï¿½ï¿½ï¿½Ë¤ï¿½ -1 ���Ƥ��ΤǤ������ºݤ˥��ߥåȥ�����ñ¤´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ý¥ï¿½ï¿½È¥ï¿½ò¸«¤ï¿½ï¿½ï¿½ï¿½ê¤¬Ìµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¥ï¿½ï¿½ï¿½ï¿½Ï¤ï¿½ï¿½á¤¿ï¿½ê¤·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤Ç¤É¤ï¿½ï¿½Ê¤ë¤«Ê¬ï¿½ï¿½ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ �ǽ�Ū�ˤϡ����ߥåȥ����Ϥ�������Υ��ߥå����Τ�Τǡ��ۤ��2,3���ε��������ǡ������˻��äǤ��ʤ��ä����ߥå�����̵�뤷�ƾ���˽ñ¤´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¤ï¿½Êªï¿½Ç¤Ï¤Ê¤ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤Ê¤Ã¤Æ¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í½ï¿½ï¿½ï¿½Ì¤ê¥³ï¿½ß¥Ã¥È¥ï¿½ï¿½ï¿½ï¿½ñ¤´ï¿½ï¿½ï¿½ï¿½Ï¥Ê¥ï¿½ï¿½Ë¤Ê¤ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
�ޤ��ޤ���������¿�����ޥ����졼������˳�ȯ�����ͽ��ˤʤäƤ��� bot ���ޤ��Ǥ��Ƥʤ��ΤǺ��Ū�ˤϺ��ޤǤ��ڤˤʤä����Ϥ��ʤ��ΤǤ�������ȯ�˻��ä����ߵ�ϳμ¤˲����äƤ��� pull request �򤷤� Contributer Agreement �˥����󤷤Ƥ����ͤ��������󤤤�Τǡ����줫�鿷����������ȯ�Ԥ������뤳�Ȥ˴��Ԥ��Ƥ��ޤ���
siphash-1-3
�Ƕ��ruby-core (2017ǯ1��) ���ɤ�� siphash-1-3 �ˤĤ����Τꡢ Python �ˤ� ��Ƥ��Ƥߤޤ�����
��ö���� siphash-2-4 �ò¤½¤Î¤Þ¤Þ½ñ¤´ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¥Ã¥ï¿½ï¿½ï¿½ï¿½ê¤²ï¿½ï¿½ï¿½Î¤Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ configure ��������Ǥ���褦�ˤ��Ƥ��줿�ͤ������Τǡ����Ϥ��οͤ� pull request ���äƤ����Τ��ԤäƤ��ޤ���
�ѥե����ޥ󥹤ؤαƶ��Ǥ����� Python ��ʸ���󥪥֥������Ȥ� immutable �ǥϥå����ͤϰ��ٷ׻������ȥ��֥������Ȥ���˥���å��夵���Τǡ��ϥå���ؿ�������®���ʤä����٤Ǥϥѥե����ޥ󥹤ˤ��ç¤ï¿½ï¿½ï¿½Æ¶ï¿½ï¿½Ï¤ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ JSON ��ǥ����ɤ���Ȥ��ʤɡ�������ʸ���󥪥֥������Ȥ� dict �Υ������ɲä�����������椹��Ȥ��ˤϤ���äȺ����Ф�ΤǤ�����ɸ��饤�֥���JSON�Ϥ����ޤǥ��ꥫ��˥��塼�󤵤�Ƥʤ� (ʸ����Υ��������׽����ʤ���ʬŪ��C��ȤäƤ뤱�����Τ� Python �ǽñ¤«¤ï¿½Æ¤ï¿½) �ΤǤ���Ǥ�2~3%���٤��������Фޤ���Ǥ�����
�ȤϤ���������� �ֺǶ��ruby-core�פȡֺǶ��Python-dev�פǤ��ߤ��ˤ����ƶ���Ϳ�����äƤ�������ʤ��Ȼפ��ޤ���
re performance
Go �γ�ȯ�Ԥΰ�ͤǤ⤢�� Russ Cox ����Ρ� PCRE �ʤɤ�����ɽ�����󥸥� (a?){n}a{n} �� "a"*n (n=3 �ʤ� a?a?a?a{3} �� aaa) ��ޥå�������Τ� O(2^n) �η׻��̤������äƤ��ޤ����ɡ��Хå��ȥ�å�����ʤ���NFA�Ȥ��� O(n^2) �ˤǤ����ͤäƵ���������ޤ��� https://swtch.com/~rsc/regexp/regexp1.html
����Ͽ����������ǤϤʤ���Ǥ����� Python ��ɸ��饤�֥��� re �����äȤ����٤������Τޤޤ���ͤȤ������Ȥ�ML������ˤʤ�ޤ�����
Python �� re ���֤������뤳�Ȥ���Ū�˳�ȯ����Ƥ��� regex �ǤϤ����������ɽ�����٤��ʤ�ʤ����ɡ��֤������ɤ�����Ρ���äѤ� Python ���Τ��̤˥С�����󥢥åפǤ��븽���ݻ��Ǥ����䡣 requests �ߤ�����Python�� re �Υɥ�����Ȥ��饪�����᥵���ɥѡ��ƥ����饤�֥��Ȥ��� regex �ؤΥ�󥯤�񤤤Ƥ������ɤ��󤸤�ʤ��� regex �Ϥ����Ĥ������å�����Ƥ뤫�餳�ε���������٤��ʤ�ʤ�����ɤ⡢ NFA ����ʤ��ƥХå��ȥ�å��ʤΤ��Ѥ��ʤ��衢NFA�Ȥ������ʤ� re2 ��Ȥ������Ȥ��������ε���������ޤ�����
���ʤߤ�Go������ɽ�����٤��Ⱥ�ǯ��ISUCON������ˤʤ�ޤ�������C������re2�����٤���ΤΤ�����NFA�ˤʤäƤ��ơ� Python �ʤɤθ������ redos �˶����ʤäƤ��ޤ���
Python �� web ��ȯ���Ƥ���ͤʤɡ��������Ϥ��Ф�������ɽ����Ȥ����̤�����ʤ顢 Facebook���� re2 binding �Ǥ��� fb-re2 �������� fork �� re �Ȥθߴ�����Ż뤷�Ƥ� re2 ��ȤäƤߤƤϤ������Ǥ��礦��
Investigating Python memory footprint of one real Web application
Instagram �γ�ȯ�Ԥˤ�롢 Dismissing Python Garbage Collection at Instagram �Ȥ����������� Python �Ρ֤��Ȥ���GC��ߤ��װƷ���Ȱ���������ˤʤ�ޤ�����
���ε����ϥѥե����ޥ󥹤Ȥ������� prefork �� copy on write ���̤ǥ������󤷤����Τ˽۴Ļ���GC�Τ����ǥ��꤬��Í����ʤ��ʤ뤫��Ȥ�����ͳ�� GC ��ߤ�Ƥ��ޤ��������⤽��۴Ļ���GC�μ����ˤ��뻲�ȥ������GC�ޤǻߤ��Ȥ����äǤϤʤ��Τǡ�Ruby on Rails �Ρ֤��Ȥ���GC��ߤ��� �Ȥ������̤��äǤ���
Perl ���Τ� php ��Ʊ���������ȥ������GC�����Ǥ�������̤�ư���ޤ����� �۴Ļ���GC��Ŭ�ڤ˥��塼�˥󥰤���Τ��񤷤�����ޤ���
����Ϥ��Ƥ��������ҤǤ�CPU�Х���ɤΥץ��������ϥ�������2�����٤˹ʤ����¿���Τǥץ����������Ķ��ǥ�����Â�����뤳�ȤϤۤȤ�ɤʤ��ơ� AWS �� c4 ���󥹥��󥹤Ǥ���꤬����;�äƤ��ꤹ��ΤǤ�����������ˤ��̤λ��ۤ�����߷ס���������Ƥ륢�ץ�⤢��櫓�ǡ���������̤Ͼ��ʤ��˱ۤ������ȤϤ���ޤ���
���������Ҥγ�ȯ��ΤȤ���Ʒ�Υ����ɤ��Ҽڤ��ơ���ư��Υ�������̤���������Ϥ��Ƥߤ��Τ�����ML�Υ���åɤˤʤ�ޤ��� (������ˡ�ˤĤ��Ƥ��̤ε���˾Ҳ𤷤ޤ���) ���Ƥ���Ĥ��Ҳ𤷤Ƥ����ޤ���
���ҤΥ����ɤ�Python �� type hinting ��¿�Ѥ��Ƥ��� -> List[User]
�ߤ����ʤΤ����̤ˤ��������ɡ����� List �ʤɤ� Python �� ABC (�ºݤ˷Ѿ����Ƥ��ʤ����饹�֤˥��֥��饹�ط�������Ǥ���褦�ˤ�����Ȥ�) ��Ѿ����Ƽ�������Ƥ��ơ����줬 SQLAlchemy �� ABC �λȤ��������������������֥��饹�ط���Ƚ����®�����뤿��Υͥ��ƥ��֥���å�������̤��������Ƥ��ޤäƤ��ޤ����� ����� typing
�⥸�塼�뤬 List[X]
�� List
�ǥ���å����Í����Ȥ�����Ŭ����Ƴ�������Τǡ�3���꡼��ͽ��� Python 3.6.1 �Dz�������ޤ���
����¾�� type hinting �ˤ���������̤Υ����С��إåɤϡ��ç¤ï¿½ï¿½ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½É¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤ï¿½Ã¤Æ¤ï¿½Ìµï¿½ï¿½ï¿½Ç¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½é¡¢ docstring ���ɤ߹��ޤʤ� -O2
���ץ����ߤ����˥�󥿥�����ɤ߹��ޤʤ���Ŭ�����ץ���󤬤��ä������ɤ����⤷��ʤ���
�����ȤΥ�������̤ϡ� str > dict, tuple > ����¾�� str ���ä� SQLAlchemy �� docstring ���ç¤ï¿½ï¿½ï¿½ï¿½ -O2
��Ȥ��� dict, tuple > str > ����¾�ˤʤꡢ dict �� tuple �����줾�� 10% ���ĥ����ȤäƤ��롣 -O2
�� docstring �����Ǥʤ� assert ��ä��Ƥ��ޤ��Τǡ���Ŭ������̤����椹�륪�ץ�����ߤ�����
����¾��Python 3.6 �� compact �ˤʤä� dict ��⤦1�ʾ����������ꡢ tuple �򸺤餹�褦�ʼ�����Υ����ǥ���Ф����Τǡ���ǯ���� feature freeze �ˤʤ� Python 3.7 �ޤǤˤǤ��������Ƥ���������
³��FASTCALL
������� tp_call
�� FASTCALL �Ǥ� tp_fastcall
���ɲä����ä򤷤��ΤǤ��������Υ����åȤȸƤФ��ؿ��ݥ��󥿤��ɲäϡ�ABI�ߴ��� (���ꤵ�줿API�Ǥ�ABI�ޤǸ����ߴ��������ݤ���Ƥ��ơ��Ť� Python �����˥ӥ�ɤ��줿��ĥ�⥸�塼�뤬������ Python �����Ȥ���) �ʤɤδط��⤢��빽���ѤǤ���
�����ǡ��ɤ����ɲä���ʤ�Ʊ���� tp_new
, tp_init
�Ȥ��������åȤ� FASTCALL �б������С������� tp_fastnew
, tp_fastinit
���ɲä��Ƥ��ޤ��ȡ� Victor ���󤬤�������ĥ��ޤ�������ĥ�ä���Ǥ����������ޥ������٥����®���ʤ��ΤμºݤΥ饤�֥���Ȥä��ޥ����٥���Ǥ��ç¤ï¿½ï¿½Â®ï¿½Ùºï¿½ï¿½ï¿½ï¿½ï¿½Â¬ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¥ï¿½Î¥ï¿½ï¿½ï¿½ï¿½ï¿½Ê¬ï¿½Ë¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¥Ã¥ï¿½ï¿½Ê¤Î¤ï¿½ï¿½Í¤ï¿½ï¿½ï¿½Ó¥å¡¼ï¿½ï¿½ï¿½Æ¤ï¿½Ö¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ê¤·ï¿½Æ¤ï¿½ï¿½ë¥±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ°ï¿½ï¿½ï¿½Î¤ï¿½Ê¬ï¿½ï¿½ï¿½ë¡¢ï¿½Ç¤â¥µï¿½ï¿½ï¿½É¥Ñ¡ï¿½ï¿½Æ¥ï¿½ï¿½ï¿½ï¿½Î¹Ôµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä¥ï¿½È¤ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Çµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¤ï¿½Í½ï¿½Û¤Ç¤ï¿½ï¿½Ê¤ï¿½ï¿½×¤È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¤Î¤Ç¡ï¿½ï¿½Ú¥ï¿½Ç¥ï¿½ï¿½ó¥°¤Ë¤Ê¤ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
����ʳ�����ʬ�Ǥ� FASTCALL ��Ŭ���ϰϤ���ƻ�������Ƥ��ޤ����㤨�С� Python �� __getitem__
�ʤɤ��ü�᥽�åɤ�������ƥ����åȤ���᤿�Ȥ��������åȤ��餽�� Python �ؿ���ƤӽФ��Τ� FASTCALL ��Ȥ��褦�ˤʤä��Τȡ� Python 3.6 �ǥ᥽�åɸƤӽФ����®�������ƥ��˥å����Ȥ߹�碌�뤳�Ȥǡ��ޥ������٥���Ǻ����30%�ι�®�����Ǥ��ޤ�����
@methane
�Ƕ�� Python-dev (2017-01)
@methane �Ǥ��� compact dict �� Python 3.6 ��9��ʥ١����ˤʤ�ľ���ˤ˥ޡ������졢����Τ������ǿ������餤 10������� Python �� Core Developer �ˤʤ�ޤ�����
��Python�Υե륿���ॳ�ߥå��Ȥ���KLab�˸ۤ��Ƥ���פȤ������ǤϤʤ��ΤǤ����� ��Ȥ�ȼ��ʺ��̤Ƕ�̳���֤���Ⱦ��OSS�ؤι׸��䥳���ɤ��ɤळ�Ȥ���䤷���äˤ���3����̤� Python �Ф��꿨�äƤ����Τǡ��¼�Ū�ˤ϶ᤤ���֤Ǥ���
������Ǥγ�ư�ò¤¢¤Þ¤ï¿½ï¿½ï¿½ï¿½Ü¤Ç¶ï¿½Í���뵡�ñ¤¬¤Ê¤ï¿½ï¿½Î¤Ç¡ï¿½ Money Forward ���������󤬽ñ¤«¤ï¿½Æ¤ï¿½ï¿½ï¿½ �Ƕ�� ruby-core �Ȥ���������ꥹ�ڥ��Ȥ��ơ� �Ƕ�� Python �γ�ȯ������Ҳ𤹤ëµï¿½ï¿½ï¿½ï¿½ñ¤¤¤Æ¤ß¤ï¿½ï¿½ï¿½ï¿½È»×¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
Python 3.6 ��꡼��
12/23 �� Python 3.6 ����꡼������ޤ������Ҳ𤷤���ʤ��ۤɤ�������ν��פʲ���������Ƥ��ޤ����� ¿ʬ (Python �����ʻȤ�ʤ��ͤˤ�) ���֤狼��פ��Τ� f-string �Ǥ��礦��
f-string ��ʸ�������˼���񤯤��Ȥ��Ǥ��뵡ǽ�Ǥ���¿����LL�����äƤ��뵡ǽ�ʤΤǤ��������Ѥ���ȴ�ñ�˥��Ƥ��ˤ��������ɤ��񤱤Ƥ��ޤ��Τǡ�
���� "{foo.name} = {foo.value}".format(foo=foo)
�Ƚ񤤤Ƥ����Τ� f"{foo.name} = {foo.value}"
�Ȥ���褦�ˡ�
���� .format(name=name)
���֤������Ȥ��ƻȤ��Ϥ�뤳�Ȥ򤪤����ᤷ�ޤ���
�䤬��˹׸������Τ� compact dict �� asyncio �ι�®���Ǥ���;�̤Ǥ����� Python 3.6 ��2����˥�꡼�����줿 Ruby 2.4.0 �ˤ� compact dict �Ȥۤ�Ʊ��ο������ϥå���μ�����Ƴ������ޤ����������Ǥ��͡�
(���) C locale �Ǥ� UTF-8 ���ݡ��Ȳ���
Linux �Ǥ� Python �ϥ����ߥʥ롢ɸ�������ϡ��ե�����ѥ��ʤɤΥ��󥳡��ǥ��󥰤� locale �򸫤Ʒ��ꤷ�ޤ���
�Ǥ����� POSIX �� C locale (POSIX locale �Ȥ����) �� ASCII ��Ȥ��ȷ����Ƥ��뤿��ˡ��� ASCII ʸ����Ȥ��� UnicodeEncodeError ��ȯ�������Ƥ��ޤ��ޤ���ɸ�������Ϥ˴ؤ��Ƥ� PYTHONIOENCODING �Ȥ����Ķ��ѿ�������Ǥ���ΤǤ����� ���ޥ�ɥ饤������ȥե�����ѥ��Υ��󥳡��ǥ��󥰤�����Ǥ��ޤ���Ǥ�����
C locale �ϥǥե���ȤΥ�������ʤΤǡ� crontab �˻��ꤷ�ʤ��ä��Ȥ��� ssh �� LANG=ja_JP.UTF-8
�����ä���³���
�������� ja_JP.UTF-8
�����������äƤ��ʤ��ä��Ȥ��ʤɤ˰տޤ����Ȥ��ޤ����������줿���顼��å������ʤ��
�ʱѸ����𤷤ˤ�������˸������ʤ��Ȥ������ޥ�ɤε�ư���Ѥ��Τ���������Ȥ�����ͳ�ǰտ�Ū�� C locale
��Ȥ����󥸥˥���¿���Ǥ��礦������ƥʤ��Ȥ߹��ߤʤɤξ�����Linux�Ķ�����Ȥ������̺︺�Τ���� C �ʳ��Υ������뤬
���⤽��¸�ߤ��ʤ����Ȥ⤢��ޤ���
�����������ޤ��ޤ���ͳ�� C locale ��� Python ��Ȥ��ȡ� UnicodeEncodeError ��ȯ������������ꡢ�ä� Python ��ȯ�ԤǤϤʤ� Python ���Υġ����ȤäƤ�����οͤ򺤤餻�뤳�Ȥˤʤ�ޤ���
Python �Ϲ����桼�����ؤ������Ƥ���Τ� locale �λȤ�������͡��ʤΤǤ���������Ǥ������� ASCII ������Ȥ������� C locale ��ȤäƤ���桼�����ϤۤȤ�ɤ��ʤ��������Ȥ������Ȥǡ� C locale �ǥǥե���Ȥ� UTF-8 ��Ȥ��������Ƥ�����Ƥ��ޤ���
(�ޤ�����ʳ��ʤΤǡ� Python �γ�ȯ�֥���������å������Ȥ��Ƥ�Ȥ��ޤ���)
PEP 540: Add a new UTF-8 mode
Python �� UTF-8 mode ���ɲä��褦�Ȥ�����ƤǤ��� UTF-8 mode �Ǥ� locale �����ꤹ�륨�󥳡��ǥ��󥰤�̵�뤷�ơ� �ե�����ѥ���ɸ�������Ϥ� UTF-8 �ˤʤ�ޤ���
���Υ⡼�ɤϸ�̩�˸����� disabled, enabled, strict ��3�Ĥξ��֤�����ޤ��� enabled �� strict �ΰ㤤�ϡ� UTF-8 �Ǥʤ� �Х������Ʃ��Ū�˰�������� surrogate escape ��Ȥ����� UTF-8 �Ǥʤ� �Х�����ϥ��顼�ˤ��뤫�Ǥ���
C locale �Ǥϥǥե���ȤǤ��Υ⡼�ɤ� enabled �ˤʤꡢUTF-8�Ǥʤ��ե�����ѥ���ɸ�������Ϥؤ��ɤ߽ñ¤¤ï¿½ï¿½ï¿½Ç½ï¿½Ë¤Ê¤ï¿½Þ¤ï¿½ï¿½ï¿½ �����Ϥ�ä��˻Ȥ�ʤ������Τ�ʤ��Ǥ����������Υե����륷���ƥ��ޥ���Ȥ����Ȥ��Ȥ��˴ò¤·¤ï¿½ï¿½Ï¤ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½
C �ʳ��� locale �Ǥ� locale ����Υ��󥳡��ǥ��󥰤� strict �ǻȤ���Τǡ� UTF-8 �ʳ��Υǡ����ϥ��顼��ȯ�������ޤ��� ������� UTF-8 �ʳ��Ͻ�������Ȥ��ˡ����ä�ʸ�����������ǡ�������Τ����˵��Ť��ƻߤ᤿���Ȥ��������Ǥ���
���Υ⡼�ɤ� PYTHONUTF8
�Ȥ����Ķ��ѿ��� -X utf-8
�Ȥ������ץ���������Ǥ���Τǡ� locale ��̵�뤷�����ͤ�
.bashrc
�ʤɤ� export PYTHONUTF8=1
�Ƚ񤯤��� /etc/environment
�� PYTHONUTF8=1
�Ƚ񤤤Ƥ������ɤ��Ǥ��礦��
PEP 538: Coercing the legacy C locale to C.UTF-8
������ϡ��Ķ��ѿ������ꤷ�Ƥ���Τ� C locale ���ä��Ȥ��ˡ� locale �� C.UTF-8 ��(�����ƥब�б����Ƥ����)�ѹ����Ƥ��ޤ����Ȥ�����ƤǤ���
����ˤ�ꡢ Python ���Τ����Ǥʤ����̤Υ饤�֥��� ASCII �� latin1 �ǤϤʤ� UTF-8 ��ư���褦�ˤʤ뤳�Ȥ����Ԥ���ޤ���
�㤨�� Python �� REPL �Ǥ�Ȥ��Ƥ��� readline ����������Τǡ� Android ��� Python �� REPL �� ��������򤷤ʤ��Ƥ��Ŭ�� UTF-8 �򰷤���褦�ˤʤä��Ȥ�����𤬤���ޤ���
�������ƤӽФ�����γ��� (METH_FASTCALL
)
���衢C���������鸫�� Python �δؿ��ƤӽФ��Ȥϡ���������򥿥ץ�ǡ�������ɰ����� dict ���Ϥ���ΤǤ�����
Python 3.6 �ǥ��ץ������ˤ������������Ƭ�ݥ��󥿡ܽ�������ο����Ϥ��ƤӽФ������о줷���ƤӽФ�¦�� �����å����Ѥ�������򥿥ץ�˵ͤ�ʤ��Ƥ⤽�Τޤ��Ϥ���褦�ˤʤ�ޤ�����
���ߡ�C����Ǻ�ä���Python����Ƥ٤�ؿ��פ򤳤ο������ƤӽФ�������б��������Ȥ��ʤ�Ǥ��ơ����פ���ʬ�Ϥ��餫���б��������ޤ�����
�ޤ������ʤ��������äˤʤ�ΤǤ����� PyMethodDef
(̾��, �ƤӽФ�����򼨤��ե饰, �ؿ��ݥ��󥿤Ǥʤ빽¤��) �Ǻ�������ؿ���᥽�åɰʳ��ˡ�
���֥������ȼ��Τ��ƤӽФ���ǽ (Python �˾ܤ����ͤʤ顢 operator.itemgetter()
���֤����֥������ȤȤ���������뤫���Τ�ޤ���) �ʷ������ꡢ������Ϸ��Υ᥿�ǡ����Ȥʤ빽¤�Τ˴ؿ��ݥ��� tp_call
���ޤޤ�Ƥ��ޤ���
PyMethodDef
�����Ͻ��褫��ե饰��Ȥä�ʣ���θƤӽФ�������б����Ƥ����Τǡ�C���줫��Ƥ֤Ȥ������Ѥ�API��ȤäƤ��ޤ����� ����tp_call
�����Ϻ��ޤǥ��ץ�� dict ��������ɸ��θƤӽФ����󤷤����ݡ��Ȥ��Ƥ��ʤ��ä��Τǡ������Υ饤�֥�꤬API���ͳ�����˴ؿ��ݥ��󥿤�ľ�ܸƤӽФ����Ƥ��ޤäƤ����ǽ��������ޤ���
�����Ǹߴ����ݻ��Τ���� tp_fastcall
�Ȥ����ؿ��ݥ��󥿤򿷤����ɲä��� tp_fastcall
���Ѱդ��Ƥ��뷿�ˤϼ�ưŪ�� tp_call
���Ѵ����뤿��δؿ�������褦�ˤ���ѥå�����ӥ塼��Ǥ���
�٤����褦�Ǥ����� Python ���������鸫����1�ĤθƤӽФ��ΰ�������C����������Ǥ�ʣ���δؿ��δ֤ǰ����Ϥ�����������Τǡ������˿������Ƚ��������������äƤ����;�פ��Ѵ������٤�ȯ�������ǽ��������ޤ���
Python 3.7 �Ǥ������Ǥΰ������Ϥ����������������줵��ƿ������ƤӽФ�����μ��Ϥ�ȯ���Ǥ���Ȼפ��ޤ���
Github �ؤΥޥ����졼�����
��ǯ��1��˥��ʥ��󥹤���Ƥ����塹�Ƚ������ʤ�Ǥ��Ƥ����� Mercurial ���� Git�� hg.python.org ���� Github �ؤΰܹԤǤ������塹�Ƚ������ʤ�Ǥ���褦�Ǥ���
1/17 �� Python 3.4.6 �� 3.5.3 ����꡼�����졢 migration window ���������Ƥ������֤��Ϥޤä��Τǡ����������ºݤ˰ܹԤ��륹�����塼�뤬���ʥ��󥹤����Ȼפ��ޤ���1����˰ܹԤǤ�����ɤ��ʡ���
pixiv private isucon 2016 Python �Ǽ������Ѱդ��ޤ���
��ǯ�� ISUCON �Ǥ� Python �������󶡤���뤳�Ȥ� ȯɽ����ޤ�����
Python �Ǥ������ϲ���ͽ������Ǥ��ǽ�Ǥ�������ǯ�ν�������ब������������� �����Ǥ���褦�� Python �Ǥμ������Ѱդ��ޤ������Ȥꤢ�����٥���ޡ��������������� �Ȥ����ޤǤϳ�ǧ���Ƥ���ޤ���
�Ѱդ����Τϥ��ץ�μ��������ʤΤǡ������Ȥä���������ݤ�
pixiv ���󤬸�������Ƥ��� AMI
�� webapp
�ǥ��쥯�ȥ��۲��� python
�Ȥ���̾���� git clone ����
systemd �ʤɤ�����������ΰ�ĤȤ��Ƽ����ǹԤäƤ���������
�ޤ����֤�����Ȥ��˼�ʬ�ǥ��塼�˥󥰤��Ƥߤơ��ߥɥ륦����������� �ġ��롦�ƥ��˥å��ʤɤ�����������Ȼפ��ޤ���
@methane
vmprof-flamegraph ����ޤ���
vmprof-flamegraph ���ä��ΤǤ��ξҲ�򤷤Ƥ����ޤ���
�ޤ�������ץ�Ȥ��� Sphinx ��Ȥä� Python �Υɥ�����Ȥ�ӥ�ɤ����Ȥ��� vmprof ��̤� flamegraph �ˤ��Ƥߤ��Τǡ��ɤ�ʤ�Τ��Ϥ�����򸫤ƤߤƤ���������
http://dsas.blog.klab.org/img_up/sphinx-prof.svg
flamegraph �ˤĤ���
flamegraph �ΰ���Ū�ʾҲ�ˤĤ��ƤϾ�ά���ơ���󥯤����֤��Ƥ����ޤ���
����������: http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html
���ܸ�ξҲðµ»ï¿½: http://d.hatena.ne.jp/yohei-a/20150706/1436208007
¾�˥ץ��ե������̤�ӥ��奢�饤������ġ���Ȥ��Ƥ� cachegrind �� (kcachegrind, wincachegrind �ʤ�) ������ޤ����� flamegraph �����������å��ȥ졼���� �٤���ʬ��ʬ����䤹���ΤǺǶ�Τ���������Ǥ���
���Ȥ���Web���ץ�ǡ�ORM�Υ����ꥪ�֥������Ȥ���ºݤΥ�������������Ƥ����¹Ԥ��Ʒ�̤򥤥󥹥��󥹲�����������Ť������狼�ä��Ȥ��ޤ��� ���ξ�硢 cachegrind �ϤǤ�ɤ�����ƤӽФ���Ƥ���Τ��Ť��Τ��ޤǤϤ�������ʬ����ޤ��������� flamegraph ��Ȥä����ϡ� ��������ƤӽФ��줿���ϥ��󥹥����������Ť������̤˥��֥������Ȥ�������Ƥ���ʤɡˡ����ä�����ƤӽФ��줿���ϥ�����ӥ�ɤ��Ť� ��ñ��˥�����μ¹Բ����¿���ʤɡˡ��ޤǤҤ��ܤ��İ����뤳�Ȥ��Ǥ��ޤ���
¾�Υ��åȤȤ��ơ�GUI���ץ꤬���פǥ֥饦���Ǹ��뤳�Ȥ��Ǥ���Ȥ��� flamegraph.pl
�˿��碌��ǡ����ե�����Υƥ����ȷ�����
grep �ʤɤΥġ���ȿ��������⤤ (��̣������ؿ��� grep ���Ƥ��鿩�碌�뤳�Ȥ��Ǥ���) �ʤɤΥ��åȤ����ꡢ�Ȥ��䤹���Ǥ���
���Υƥ����ȥե�����Υե����ޥåȤϥ���ץ�ǡ��ƹԤ����Τ褦�ˤʤäƤ��ޤ���
�ȥåץ�٥�δؿ�̾;1�ʿ����ؿ�̾;���ֿ����ؿ�̾ ����ץ��
�ؿ�̾�Ȥ��Ƥ���Ȥ����ϼºݤˤϤʤ�Ǥ��ɤ�������ץ���������Ǥ���в��Ǥ��ɤ��Ǥ����ʤΤ�CPU���ְʳ��ˤ��������̤Ȥ����������Ū�����Ѥ��뤳�Ȥ��Ǥ��ޤ���
vmprof �ˤĤ���
PyPy �ץ��������Ȥdz�ȯ����Ƥ��롢 PyPy �� CPython �ѤΥ���ץ�󥰥ץ��ե�����Ǥ���
����ץ�󥰥ץ��ե�����ʤΤǡ�����ץ�ֳ֤�Ĺ��ˤ���Х����С��إåɤ򾮤������뤳�Ȥ��Ǥ������ִĶ���ư�������Ȥ��ǽ�Ǥ���
�ޤ��ޤ���ȯ��Υץ��������ȤǤ���������ץ�󥰥ץ��ե����鹥���ʤΤ��Ѷ�Ū�˻ȤäƤ��ޤ���
vmprof �ϥӥ��奢�饤���Ȥ����ȼ��� Web ���ץ��ȯ���Ƥ��ơ��ºݤ� http://vmprof.com/ ��ư���Ƥ��ޤ��� �ä� PyPy �Υץ��ե������̤򸫤��硢 JIT �Υ������ॢ�åפʤɤ⸫�뤳�Ȥ��Ǥ��ޤ���
���� Web ���ץ�� https://github.com/vmprof/vmprof-server �򸫤�Сʤ������٤�Python���μ�������С˴�ñ��ư�������Ȥ��Ǥ��ޤ���
vmprof-flamegraph �ˤĤ���
��ñ��ư������ȸ��äƤ⡢�ץ��ե������̤򸫤뤿������˼����Web���ץ���Ѥ���Τ����ݤǤ��� CPython ��ư�����Ƥ��륢�ץ�Υץ��ե�����򸫤�����ʤ� flamegraph ��Ȥ��ۤ�������ڤǤ���
�Ȥ������Ȥǡ� vmprof ����������Х��ʥ�����Υץ��ե������̤� flamegraph.pl �����ϥե����ޥåȤΥƥ����ȥե�������Ѵ�����Τ� vmprof-flamegraph �ˤʤ�ޤ���
���󥹥ȡ�����ˡ�ϡ� flamegraph.pl �� PATH ���̤ä��ǥ��쥯�ȥ���֤��Ƥ����� vmprof �򥤥󥹥ȡ��뤷�� Python �δĶ���
pip install vmprof-flamegraph
��������Ǥ���
���� Python �Ķ��� bin �ǥ��쥯�ȥ�� vmprof-flamegraph.py
�����󥹥ȡ��뤵��ޤ���
�Ȥ����ϼ��Τ褦�ʴ����ˤʤ�ޤ���
$ python3 -m vmprof -o profile.data <Python������ץ�> $ vmprof-flamegraph.py profile.data | flamegraph.pl > profile.svg $ open profile.svg # Mac �ξ��
�ܺ٤� vmprof-flamegraph �� flamegraph.pl �Υإ�פ򸫤Ƥ���������
@methane
Python �˸��߼������ Compact dict �ξҲ�
�ط�
2015ǯ1��ˡ� PyPy �γ�ȯ��Blog�ˤ���ʵ������ݥ��Ȥ���ޤ�����
Faster, more memory efficient and more ordered dictionaries on PyPy
���θ��꡼�����줿 PyPy 2.5.1 ���� dict ���������ݻ�����褦�ˤʤꡢ��������̤�︺����ޤ�����
���� CPython �Ǥϡ� PEP 468 �ǡ�������ɰ����� **kwargs
�Ȥ��������β������Ǽ������Ȥ��ˡ������ν������¸���褦�Ȥ�����Ƥ�����ޤ�����
�㤨�С� SQLAlchemy �Υ����꡼�� .filter_by(name="methane", age=32)
�Ƚ񤤤��Ȥ�����������륯���꡼�� WHERE name = "methane" AND age = 32
�ˤʤ뤫 WHERE age = 32 AND name="methane"
�ˤʤ뤫������ä��Τ��������Ƚ����ݻ�����褦�ˤʤ�Ȥ��ä����åȤ�����ޤ���
(filter_by ���������ѤΥ��硼�ȥ��åȴؿ��Ǥ��äơ�������ɰ�����Ȥ�ʤ� filter �Ȥ����᥽�åɤ�Ȥ��н����ݻ�����ޤ���)
������ƼԤ� pure Python ���ä� OrderedDict ���饹��C�ǺƼ������ơ� Python 3.5 ���� OrderedDict ������®���ľʥ���ˤʤ�ޤ����� (dict �����ν������򤱤��Τϡ�������� dict �� Python ���󥿥ץ꥿�Τ����ʣ���˺�Ŭ������Ƥ��뤫��Ǥ���)
��������C�ǺƼ������줿�Ȥϸ�������������󥯥ꥹ�Ȥǽ����������줿 OrderedDict �Ϥ���ʤ�˥����С��إåɤ�����ޤ����ä˥�������̤ˤĤ��Ƥϡ��ܶᤤ��������ޤ���
Python 3.5.1 (default, Dec 7 2015, 17:23:22) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> d = {i:i for i in range(100)} >>> from collections import OrderedDict >>> od = OrderedDict((i,i) for i in range(100)) >>> sys.getsizeof(d), sys.getsizeof(od) (6240, 11816)
���Τ����⤢�ꡢ�ޤ� PEP 468 �ϻߤޤä��ޤޤˤʤäƤ��ޤ���
��⡢�����Υ桼��������������������Ȥ��äơ����ƤΥ�����ɰ�������ǽ����Ȥ���ǽ���������ѹ��ˤ��񹳤����ꡢ�ޤ� PyPy �μ������� dict �˶�̣�����ä��Τǡ� Python 3.6 �˥��ꥮ��֤˹礦���Τ�����ĩ�魯�뤳�Ȥˤ��ޤ�����
(ͽ��Ǥ�9����Ⱦ�� beta ��꡼�����쵡ǽ�ɲäǤ��ʤ��ʤ�Τǡ�����ޤǤ˼�����ɾ�����ڡ�ML�Ǥε����ʤɤ�Фƥޡ��������ɬ�פ�����ޤ�)
�ǡ�����¤
�ѹ�������¤�Τ� PyDictKeysObject �����Ǥ���������������������쥤�����Ȥ����ưŪ�ˤʤ�ޤ���
struct _dictkeysobject { Py_ssize_t dk_refcnt; Py_ssize_t dk_size; dict_lookup_func dk_lookup; Py_ssize_t dk_usable; Py_ssize_t dk_nentries; /* How many entries is used. */ char dk_indices[8]; /* dynamically sized. 8 is minimum. */ }; #define DK_SIZE(dk) ((dk)->dk_size) #define DK_IXSIZE(dk) (DK_SIZE(dk) <= 0xff ? 1 : DK_SIZE(dk) <= 0xffff ? 2 : \ DK_SIZE(dk) <= 0xffffffff ? 4 : sizeof(Py_ssize_t)) #define DK_ENTRIES(dk) ((PyDictKeyEntry*)(&(dk)->dk_indices[DK_SIZE(dk) * \ DK_IXSIZE(dk)])) dk_get_index(PyDictKeysObject *keys, Py_ssize_t i) { Py_ssize_t s = DK_SIZE(keys); if (s <= 0xff) { return ((char*) &keys->dk_indices[0])[i]; } else if (s <= 0xffff) { return ((PY_INT16_T*)&keys->dk_indices[0])[i]; } else if (s <= 0xffffffff) { return ((PY_INT32_T*)&keys->dk_indices[0])[i]; } else { return ((Py_ssize_t*)&keys->dk_indices[0])[i]; } } dk_set_index(PyDictKeysObject *keys, Py_ssize_t i) { ...
�����Υϥå���ơ��֥�� 3word (hash, key, value) �� PyDictKeyEntry ��¤�Τ�����Ǥ�������������������Ǥϥϥå���ơ��֥�����Ǥ򤿤����������ˤ��Ƥ��ޤ���
��¤�Τ�����Ǥ� char dk_index[8]
�ˤʤäƤ��ޤ���������ϺǾ��� dk_size
��8����ç¤ï¿½ï¿½ï¿½Ç¡ï¿½ï¿½ÂºÝ¤Ë¤Ï¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È»ï¿½ï¿½Ë¤ï¿½ï¿½ï¿½ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ý¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¤ï¿½ dk_size �� 128 �ޤǤ� char �Ǥ��� 256 ����� int16_t �ˤʤ�ޤ������Τ褦�ˤ��ƥ��ꥮ��ޤǥϥå���ơ��֥�Υ������ò¾®¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
����ˡ� dk_indices
�Υ�������ưŪ�ʤΤǹ�¤�Τ�ľ������Ǥ��ޤ��󤬡����ι�¤�Τθ���� PyDictKeyEntry ��¤�Τ�������֤��Ƥ��ޤ�����������Υ������� dk_size �ǤϤʤ����� 2/3 (����ε����ǾҲ𤷤������Υϥå���ơ��֥��������ǽ�ʺ������ǿ�) �ˤ��Ƥ��ޤ������������Ǥ���������Ȥ��ϡ�����������ɵ����Ƥ��������Υ���ǥå����� dk_indices ����¸���ޤ��� dk_nentries ������������ǿ��ˤʤ�ޤ���
������������Ʊ���������ޤ�¸�ߤ��ʤ��Ȳ��ꤷ�����������ɤǼ����Ȥ����ʤ�ޤ���
// dk_indices ����������֤򸡺� pos = lookup(keys, key, hash); // ����ȥ�����˥���ȥ���ɵ����� DK_ENTRIES(mp)[keys->dk_nentries].me_hash = hash; DK_ENTRIES(mp)[keys->dk_nentries].me_key = key; DK_ENTRIES(mp)[keys->dk_nentries].me_value = value; // dk_indices �ˤ��Υ���ȥ�Υ���ǥå�������¸ dk_set_index(keys, pos, keys->dk_nentries); // �Ǹ�˻��ѺѤߥ���ȥ���򥤥󥯥���� mp->dk_nentries++;
���
���� dict ���饢���ƥ��������ˤϡ� dk_indices �γ������֤˥��ߡ����Ǥ��������Ƥ����ޤ��� (�ƥ���ǥå�����1�Х��Ȥǰ����륨��ȥ꡼����256�ޤǤǤϤʤ�128�ޤǤʤΤϡ��ޥ��ʥ����ͤ���ߡ��ȶ���ɽ����������Ѥ��Ƥ��뤫��Ǥ���)
����ȥ꡼����κ���ˤĤ��Ƥ�2�Ĥ�����������ޤ���
�ǽ�� compact dict �Υ����ǥ��� Python �γ�ȯ��ML����Ƥ��줿�Ȥ��ϡ��Ǹ�����Ǥ������줿���Ǥ����ä����֤˰�ư���뤳�Ȥǡ�����ȥ꡼�����̩���ݤäƤ��ޤ��������������ǤϺǸ�����Ǥ��������Τǡ������������¸����פȤ������������Ǥ��������Ȥ��˼����ޤ���
������ PyPy �亣���ͤ����Ѥ����Τϡ�ñ�˶��������� NULL ������Ƥ����Ȥ�����ΤǤ���
// dk_indices ��κ���������ǤΥ���ǥå�����������֤򸡺� pos = lookup(keys, key, hash); // ����������ǤΥ���ȥ꡼������ΰ��֤�������� index = dk_get_index(keys, pos); // ���Ǥ������� DK_ENTRIES(mp)[index].me_key = NULL; DK_ENTRIES(mp)[index].me_value = NULL; // dk_indices �˥��ߡ�����Ͽ dk_set_index(keys, pos, DUMMY);
������������ϡ������Ⱥ���򷫤��֤����Ȥ��˥���ȥ꡼���󤬥��ߡ��Ǥ��äѤ��ˤʤäƥ���ѥ�������¹Ԥ���ɬ�פ�����Ȥ����ǥ��åȤ�����ޤ��� ���������¤Ϻǽ����Ƥ��줿�����Ǥ⡢�����Ⱥ���򷫤��֤������˥ϥå���ơ��֥뤬���ߡ�����ޤäƤ��ޤ��������Ǥ��ʤ��ʤäƤ��ޤ���ǽ��������Τǡ��ɤ���ˤ�������ѥ�������ɬ�פˤʤ�ޤ������Τ��ᡢ�������ݻ����������ɤ���Ƚ�Ǥ��ޤ�����
���ʤߤˡ� .popitem()
�ϡ�����ȥ꡼����Τ����Ǹ�����Ǥ������� dk_nentries
��ǥ�����Ȥ��뤳�Ȥǡ�ʿ�ѷ׻��̤� O(1) ���ݤäƤ��ޤ���
����� dk_usable
�Ȥ����ֻĤ�������ǽ���פ򥤥󥯥���Ȥ��ʤ��Τǡ�����������򷫤��֤��ȥ���ѥ�������¹Ԥ��ƥϥå���ơ��֥��ƹ������ޤ���
Shared-Key dict
���ơ������ shared key dict �Ǥ���
�ǽ�ϡ� compact dict �������������Ʊ���褦�ˡ��ϥå���ơ��֥�˥��ߡ����Ǥ���������������ȥ꡼����¦�� NULL �ˤʤäƤ�������ߡ���Ƚ�Ǥ�����ɤ��ȻפäƤ��ޤ�����
������������Ǥ� shared key �˺ǽ�����Ǥ��ɲä��� dict �������礷����¸���뤳�Ȥ��Ǥ��ޤ���
>>> class A: ... pass ... >>> a = A() >>> b = A() >>> a.a = 1 >>> a.b = 2 >>> b.b = 1 >>> b.a = 2 >>> a.__dict__.items() dict_items([('a', 1), ('b', 2)]) >>> b.__dict__.items() # ������� b, a �ʤΤˡ����� dict_items([('a', 2), ('b', 1)])
��������ˤĤ��ơ�����3�Ĥ����ˤ�ͤ��Ƥ��ޤ�����ML�ǵ����������Guido��Guido����Ǥ����������ȯ�Ԥ��ǽ����ꤹ��ޤǤɤ�ˤʤ뤫ʬ����ޤ���
(1) ����Τޤޤ���������
���� Python �θ�����ͤǤϡ� dict �ν��������Ǥ����ʤΤǡ��֥��󥹥��󥹤�°����������� dict ����������������¸����פȤ�������ư��⡢�������Ū�ˤ�����ʤ����Ȥˤʤ�ޤ���
compact dict �ˤʤ�� shared key dict �� ma_values ����Υ������� dk_keys ���餽�� 2/3 �ˤʤäƤ�ꥳ��ѥ��Ȥˤʤ�Τǡ����β��ä����˼���������Ǥ��ޤ���
�������ǥ��åȤȤ��Ƥϡ��ؤɤΥ����������������¸����褦�˿����񤦤Τǡ�������ͤ��ǧ���ʤ��ͤϤ��줬���ͤ��ȸ��򤷤Ƥ��ޤ����Ȥ�����ޤ��� ��������ϡָ��򤹤�ۤ��������פȤ���Τ��Կ��ڤǤ��� ���Ȥ��� Go �Ϥ��Υǥ��åȤ��򤱤뤿��ˡ� map �򥤥ƥ졼�Ȥ���Ȥ��ν����տ�Ū�� (��®�ʵ��������Ȥä�) ����ˤ��Ƥ��ޤ���
(2) �����礬��ä��� shared key �����
shared key �����äƤ������Ȱ㤦�������������褦�Ȥ����餹���� shared key �����Ȥ�����ˡ������ޤ���
����̵�����ˡ�˸����ޤ������ɤ줯�餤 shared key ��ݻ��Ǥ���Τ��狼��ˤ����ƥ꥽��������ͽ¬���ˤ����ʤ�Ȥ��������̤�ѥ��������礬�̾�Ȱ㤤�� shared key ���������Ƥ��ޤ��ȡ�Ʊ���������� dict ��Ʊ�����餤���Ѥ�³���Ƥ�Τ˥�������̤����露�������Ƥ��롢�Ȥ��ä����꤬����ޤ���
�¹Ի��֤�Ĺ�� Web ���ץꥱ�������ʤɤΥץ������ǡ���������̤�ͽ¬���Ť餯�����露��������Τϡ����ޤꤦ�줷������ޤ��� �ʤΤǻ�Ϥ��������˾�굤�Ǥ�̵���Ǥ���
(3) Shared Key Dict �����
shared key dict �ϡ��ϥޤä��Ȥ��ϤȤƤ��Ψ��������ΤΡ� compact ordered dict ���������ꤷ�Ƹ�Ψ�������Ǥ��� ������ shared key dict �򥵥ݡ��Ȥ��뤿��ˡ� dict �μ�����������ʣ���ˤʤäƤ��ޤäƤ��ޤ���
�ºݤ� shared key dict ����������äƤߤ��ꡢ4100����500�Ԥ��餤�������뤳�Ȥ��Ǥ��ޤ�������ñ�˺�����������ʤΤǡ�����˥�ե�������󥰤��ƺ���Ȼפ��ޤ���
������Ψ�ϡ� Python �Υɥ�����Ȥ� Sphinx �ǥӥ�ɤ���Ȥ��� maxrss �� /usr/bin/time �Ƿ�¬�����ꡢ
- shared: 176312k
- compact + shared: 158104k
- compact only: 166888k
�Ȥ��������ǡ� shared key ����Ƥ� compact dict �θ��̤ˤ�����︺�������ç¤ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½Ì¤ï¿½ï¿½Ç¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
�ʤ�����󤳤��1�ĤΥ��ץꥱ�������ˤ������̤Ǥ���̵���Τǡ�¾�˷�¬��Ŭ���������饹�䥤�󥹥��󥹤򤽤������ȤäƼ¹Ի��֤ȥ�������̤����ꤷ�Ƥ��븽�¤Υ��ץꥱ������󤬤���ж����Ƥ�����������
�ޤ��� shared key �������Ƽ������줿ʬ���̤θ�Ψ�Τ����ü첽 dict ��������ơ� compact + shared ����⤤��Ψ���������Ȥ�Ǥ��ޤ��� ���Ϥ��륢���ǥ���POC�������ʤΤǡ����Ѥ��줿��ޤ��Ҳ𤷤ޤ���
OrderedDict
OrderedDict �� compact dict ��Ȥäƹ�®��������ˡ�ˤĤ��Ƥ���Â���Ƥ����ޤ���
Python 3 �ˤϡ� Python 2.7 �ˤ�̵���ä� move_to_end(key, last=True)
�Ȥ����᥽�åɤ�����ޤ������Υ�����ɰ�����������Τǡ� move_to_end(key, last=False)
�Ȥ������Ƭ�˰�ư���뤳�Ȥ��Ǥ��ޤ����ʵ�ǽ�ϤȤ⤫���᥽�åɤ�̿̾�ˤĤ��ƤϤȤƤ⥻�󥹤������Ȼפ��ޤ��� move_to_front(key)
�Ǥ�����󡣡�
���ε�ǽ��������뤿��ˡ� dk_entries ����ò¥¥ï¿½Ñ¥ï¿½ï¿½Æ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ°Åªï¿½ï¿½ï¿½ï¿½Ç¤Ï¤Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ deque �Ȥ��ư����Ȥ��������ǥ�����äƤ��ޤ��� �Ĥޤꡢ���� dk_entries[0] ���� dk_entries[dk_nentries-1] �ޤǤ�ȤäƤ���ΤǤ���������˲ä�����Ƭ�����Ǥ��ɲä���Ȥ��� dk_entries �θ��������Ƭ�˸����ä��������Ƥ����ޤ���
�����¸�����ˤ� dk_nentries ��ȿ���Ǥ��äơ��ϥå��塼�ơ��֥��������ꥵ������������ʬ�򰷤��褦�˲�¤������ɤ��Ǥ��� OrderedDict 1�Ĥ����� 1word (8byte) ���ɲä�������ǡ���������Ⱦ�������뤳�Ȥ���ǽ�ʤϤ��Ǥ���
�Ǥ�����Shared-Key ����Ǽ���դʤ����� dict �����������¸����褦�ˤʤä��� OrderedDict �����ѵ���⸺�äƤ��ޤ��Τǡ����Υ����ǥ�������������١�����󤬤���ޤ��󡣾��ʤ��Ȥ� Python 3.6 �ˤϡ�ï�����ͤ�����˼������Ƥ���ʤ��¤�˴֤˹��ʤ��Ǥ��礦��
@methane
Python �� dict �μ����ܲ�
@methane �Ǥ���
�Ƕ� Python �� dict ��ϥå����Ƥ���Τǡ����ξҲ�򤷤����Ȼפ��ޤ��� �Ǥ������ޤ����ε����Ǥϸ��� (Python 3.6a2) �� dict �μ�����ܲ򤷤ޤ���
�ǡ�����¤
���ܤȤʤ빽¤�Τ�3�ĤǤ���(Python 3.6a2 �Υ�����������)
typedef struct _dictkeysobject PyDictKeysObject; typedef struct { PyObject_HEAD Py_ssize_t ma_used; PyDictKeysObject *ma_keys; PyObject **ma_values; } PyDictObject; typedef struct { /* Cached hash code of me_key. */ Py_hash_t me_hash; PyObject *me_key; PyObject *me_value; /* This field is only meaningful for combined tables */ } PyDictKeyEntry; typedef PyDictKeyEntry *(*dict_lookup_func) (PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr); struct _dictkeysobject { Py_ssize_t dk_refcnt; Py_ssize_t dk_size; dict_lookup_func dk_lookup; Py_ssize_t dk_usable; PyDictKeyEntry dk_entries[1]; };
PyDictObject �� dict �Υ��󥹥��󥹤�ɽ�����֥������ȤǤ��� PyObject_HEAD �� Python �Υ��֥������Ȥ��٤Ƥ����äƤ��붦�̤δ����ѥǡ����ʻ��ȥ���������ˤ��������ޥ����ǡ��̾�ӥ�ɤǤ�3��ɡ�64bit�Ķ��Ǥ�24�Х��ȡˤˤʤ�ޤ���
ma_used ������ dict �����äƤ������ǿ��� ma_keys ��ưŪ�˳��ݤ����ϥå���ơ��֥�Ǥ��� ma_values �ˤĤ��Ƥϸ�Ҥ��ޤ���
PyDictKeyEntry �ϥϥå���ơ��֥�γƥ���ȥ�Ȥʤ빽¤�ΤǤ��� me_key, me_value ��̾���Τޤޥ������б������ͤȤʤ� Python ���֥������ȤؤΥݥ��󥿤ǡ� me_hash �� me_key �Υϥå����ͤǤ���õ����ϥå���ơ��֥�κƹ��ۤΤȤ���ɬ�פˤʤ�Τ����׻�����ΤǤϤʤ��ƥ���ȥ꡼�˻��äƤ��ޤäƤ��ޤ���
PyDictKeysObject ���ϥå���ơ��֥�Ǥ��� dk_size ���ϥå���ơ��֥�Υ������� dk_usable �����Ȳ����ǥϥå���ơ��֥��������뤫�򼨤������󥿤Ǥ��� dk_usable �� 0 �ΤȤ����������褦�Ȥ���ȥϥå���ơ��֥뤬�ƹ��ۤ��졢ɬ�פ˱����Ƴ�ĥ����ޤ��� dk_refcnt �ˤĤ��Ƥ� ma_values �ȤȤ�˸�Dz��⤷�ޤ���
dk_lookup ��õ���ؿ��ؤδؿ��ݥ��󥿤Ǥ��� dict ���㤨�дؿ��ƤӽФ��ΤȤ���̾������ؿ���õ��������ȡ����ʸ����ò¥¡ï¿½ï¿½È¤ï¿½ï¿½ï¿½ Python �θ���δ��ܤ�٤��Ƥ���Τǡ� key �η���ʸ����� dict ���ü첽���ƹ�®�ˤ����ؿ���ǽ������Ƥ�����ʸ����ʳ��Υ��������������ʳ������Ѥδؿ��ؤΥݥ��󥿤˺����ؤ���ʤɤ�ԤäƤ��ޤ���
dk_entries �ϥϥå���ơ��֥�μ��֤Ǥ�����¤�Τ�����Ǥ�1���Ǥ�����ˤʤäƤ��ޤ������ºݤˤϼ��Τ褦�� PyDictKeysEntry �򥢥������Ȥ��뤳�Ȥ� dk_size ��Ĺ�����������ˤʤ�ޤ���
dk = PyObject_MALLOC(sizeof(PyDictKeysObject) + sizeof(PyDictKeyEntry) * (size-1));
�����ץ󥢥ɥ쥹ˡ
�ϥå���ơ��֥�Υ����� (dk_size) �� 2^n �ˤʤäƤ��ޤ����ޤ������Υϥå���ơ��֥�˳�Ǽ�Ǥ������ǿ� (dk_usable �ν����) �� (2*dk_size+1)/3 �ˤʤäƤ��ޤ���
dk_size �� 2^n �ʤΤǡ��ϥå���ơ��֥�����Ǥ����������ꡢõ��������ϡ��ϥå����� & (dk_size-1) �Ǿ�����ޤ��� (dk_size �� 8 �ʤ�2�ʿ���ɽ���� 0b1000 �ǡ� dk_size-1 �� 7 = 0b0111 �ˤʤꡢ�ϥå����ͤβ���3bit�����Ѥ��뤳�Ȥˤʤ�)
dk_usable �� 0 �ˤʤ�ϥå���ơ��֥��ƹ��ۤ���ݡ��ʺ�����ʤ������ɲä��Ƥ������ϡ�dk_size��2�ܤˤʤꡢ�ϥå���ơ��֥�Ρ�̩�١פ� 2/3 ���� 1/3 �ˤʤ�ޤ����ʤΤǥϥå���ơ��֥��̩�٤ϲ��¤��������� 1/3 ����¤� 2/3 �ˤʤ�ޤ���
���ơ��ϥå����ͤ�����ʬ�����Ƥ���Ȥ����顢�����������Ѥ����ϥå����ͤβ��̥ӥåȤξ���Ψ�� 1/3 �� 2/3 ��ʿ�Ѥ� 1/2 ���٤ˤʤ�Ǥ��礦�� �ºݤˤϥϥå����ͤ�����ʬ�����Ƥ���Ȥϸ¤�ʤ��Τǡ������ê°ï¿½ï¿½ï¿½Ê¤ï¿½Ï¤ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½
�ϥå���ˡ�Ǿ��ͤ��н褹����ˡ�Ȥ��Ƥϡ����Ǥ�ϥå���ơ��֥볰�Υꥹ�Ȥʤɤ��֤��ƥϥå���ơ��֥�ˤϤ����ؤλ��Ȥ��Ǽ������ˡ�ʥ����ץ�ϥå���ˡ�ˤȡ��ϥå���ơ��֥�����̤ξ��˳�Ǽ������ˡ�ʥ��������ɥϥå���ˡ���ޤ��ϥ����ץ󥢥ɥ쥹ˡ���֥����ץ�פ������դΥ����ץ�ϥå���ˡ�����Τ�ʶ��路���Ǥ��ˤ�����ޤ����� Python �ϥ��������ɥϥå���ˡ����Ѥ��Ƥ��ޤ���
���������ɥϥå���ˡ�Ǥϡ��־��ͤ����鼡�Ϥɤ���Ȥ����פȤ������르�ꥺ�����Ƥ����ơ�������õ����Ʊ����ˡ��Ȥ�ʤ���Фʤ�ޤ��� ���ꥢ�������θ�Ψ��ͤ���Ⱦ��ͤ��������٤ξ���Ȥ��Τ��ɤ��ΤǤ������ϥå����ͤ��ɤ��ʤ��ƾ��ͤ���ȯ�����Ȥ��䡢�ϥå���ơ��֥�����Ф꤬ȯ���������ˡ����⡢���μ��⡢���μ��⡢�Ȥ��������˾��ͤ����ǽ�����⤯�ʤ�ޤ���
�ϥå���ơ��֥�����������Ӥ˽�󤷡��ǽ�Ū�ˤϥơ��֥���������Ǥ�1�󤺤���������ؿ����ߤ����ΤǤ��������δؿ��Ȥ��� Python �� (5*i+1) mod dk_size ����Ѥ��Ƥ��ޤ��� �㤨�� dk_size �� 8 �� �ϥå����ͤβ���3bit�� 3 �ʤ顢�ϥå���ơ��֥�� 3, 0, 1, 6, 7, 4, 5, 2, 3 �Ȥ������ǡ� 0~7 ��1�٤����̤äƺǽ�� 3 ����äƤ��ޤ���
��������������ˡ�Ǥϥϥå���ơ��֥����̩�٤��Ф�αƶ����򤱤����ΤΡ��ϥå����ͤβ��̥ӥåȤ����ͤ��� key ��Ʊ�����֤˽�󤹤�Τ�����õ���ˤʤäƤ��ޤ���Ψ�������Ȥ�������������ޤ��������ǡ������δؿ����¤���ơ����Τ褦�ˤ��Ƥ��ޤ���
for (perturb = hash; ; perturb >>= PERTURB_SHIFT) { i = i * 5 + perturb + 1;
����ǡ��ǽ�Τ����ϥϥå����ͤξ�̥ӥåȤ�ȤäƼ��ΰ��֤���ꤷ�Ƥ������ϥå����ͤ򱦥��եȻ��ڤä�����ۤɤΥ��르�ꥺ��dzμ¤˽�󤹤롢�Ȥ����ϥ��֥�åɷ��ν�󥢥르�ꥺ��ˤʤ�ޤ���
(���ʤߤˡ�����for�롼�פˤϺǽ�ξ��ͤΤ��Ȥˤ���Τǡ� perturb �ν���ͤ� hash �Τޤޤ��ȡ�hash �ͤβ��̥ӥåȤ����ͤ��� key ��1���ܤ����Ǥʤ�2���ܤ���ͤ��Ƥ��ޤ��ޤ��͡�)
(�ʤ��� dict ����Ƕ�˲��ɤ��줿 set ���Ǥϡ��ǽ�ϥ���å����Ψ��Ż뤷�ƶ᤯�����Ǥ�õ���Ȥ��ä����ɤ�����Ƥ��ޤ���)
���
�����ץ󥢥ɥ쥹ˡ�Ǥ����Ǥκ���ˤ����դ�ɬ�פǤ����Ȥ����Τϡ�õ���������ΤȤ��ν��ϡ�Ʊ��������������ȯ�������Ȥ�����ߤ��뤫��Ǥ���
���ë¥ï¿½ï¿½A����������Ȥ����̤Υ���B�Ⱦ��ͤ����̤ξ������������Τˡ������̤Υ���B���������ƶ����ˤʤäƤ��ޤ��ȡ�����A��ޤ�õ������Ȥ��ˡ�����B�����ä����˶����ò¸«¤Ä¤ï¿½ï¿½Æ¡ï¿½ï¿½ï¿½ï¿½ï¿½A�ϥϥå���ơ��֥��¸�ߤ��ʤ���Ƚ�Ǥ��Ƥ��ޤ��ޤ���
������򤱤뤿��ˡ��������Ȥ��ϥϥå���ơ��֥��������᤹�ΤǤϤʤ������ߡ����Ǥ������ؤ��ޤ���
�ޤ��� popitem()
�Ȥ��� dict �����Ǥ�դ� (key, value) ��������Ĥĺ������᥽�åɤμ����ˤ����դ�ɬ�פǤ���
�ϥå���ơ��֥������õ�����ơ��ǽ�˸��Ĥ������Ǥ��֤������ξ�����ߡ����֤�������ΤǤ���������򷫤��֤��ȥϥå���ơ��֥뤬���ߡ����Ǥ��餱�ˤʤäƤ��äơ����Τ褦�ʥ��르�ꥺ��μ¹Ի��֤� O(n**2) �ˤʤäƤ��ޤ��ޤ���
while d: k, v = d.popitem() do_something(k, v)
popitem() ��ʿ�ѷ׻��̤� O(1) �ˤ��뤿��ˡ��ϥå���ơ��֥����Ƭ�����Ǥ�����Ф�����֤���̵���ä���������õ��������ˡ���������õ���򳫻Ϥ������ʶ������뤤�ϥ��ߡ�key�����äƤ������Ƭ���Ǥ� me_value �˳�Ǽ���Ƥ����ޤ���
PEP 412: Key-Sharing Dictionary
���Υ��󥿥饯�ƥ��֥��å����Ǥϡ�2�Ĥζ��� dict �Υ�������̤�ɽ�����Ƥ��ޤ���
>>> d = {} >>> class A: pass ... >>> a = A() >>> ad = a.__dict__ # a ��°�����Ǽ���Ƥ��� dict �Υ��󥹥��� >>> d {} >>> ad {} >>> type(d), type(ad) (<class 'dict' at 0x109c735b0>, <class 'dict' at 0x109c735b0>) >>> import sys >>> sys.getsizeof(d) 288 >>> sys.getsizeof(ad) 96
ξ�����Τ��� dict �ζ��Υ��󥹥��󥹤ʤΤǤ������������� 288 �Х��Ȥ� 96 �Х��Ȥȡ�3�ܶ᤯�κ�������ޤ����ʤ��Ǥ��礦����
�����ǡ��������ά���Ƥ��� PyDictKeysObject �� dk_refcnt �� PyDictObject �� ma_values ���о줷�ޤ���
dk_refcnt �ϻ��ȥ�����ȤˤʤäƤ��ơ�A �Υ��󥹥��� a ���ä��ݡ� a ��°����������� dict ���󥹥��󥹤��ä��塢���� PyDictKeysObject �� dk_refcnt �򥤥󥯥���Ȥ��ơ����饹 A �˥ݥ��󥿤�⤿���ޤ���
���θ塢���饹A�Υ��󥹥��󥹤���ݤϡ����Υ��󥹥����Ѥ� dict ����Ȥ��� PyDictKeysObject ����ΤǤϤʤ������饹A�����äƤ��륪�֥������Ȥò»²¾È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¥ï¿½ï¿½ï¿½ï¿½ï¿½È¤ò¥¤¥ó¥¯¥ï¿½ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¤è¤¦ï¿½Ë¡ï¿½Æ±ï¿½ï¿½ï¿½ï¿½ï¿½é¥¹ï¿½ï¿½Ê£ï¿½ï¿½ï¿½Î¥ï¿½ï¿½ó¥¹¥ï¿½ï¿½ó¥¹´Ö¤Ç¡ï¿½ PyDictKeysObject �϶�Í����ޤ���
�ϥå���ơ��֥��Í���Ƥ���Τǡ� me_value �˳� dict �����ĤϤ����ͤ��Ǽ���뤳�Ȥ��Ǥ��ޤ��� PyDictObject �� ma_values �ˡ� dk_size ��Ʊ���ç¤ï¿½ï¿½ï¿½ï¿½ PyObject*
�������������ơ� dk_entries[i].me_value ������� ma_values[i] ���ͤ��Ǽ���ޤ���
dk_entries �ϳ����Ǥ��ݥ���3��ʬ���ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¤Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¡ï¿½ ma_values �ϥݥ���1��ʬ�ǺѤ�Τǡ�����Ǥ��ʤ�Υ�������︺�Ǥ��ޤ���
�ޤ��� dk_usable �ν���ͤ� (dk_size*2)/3 �ǤϤʤ� (dk_size*2+1)/3 �ˤʤäƤ����Τˤ���̩������ޤ���
�̾�� dict �Ǥ� dk_size �κǾ��ͤ� 8 �ʤΤǤ����� key sharing dict �Ǥ� dk_size �� 4 �ˤʤäƤ���ΤǤ��� (4*2)/3 �� 2 �ʤΤ��Ф��ơ� (4*2+1)/3 ��3�ˤʤ�Τǡ����κǾ��� key sharing dict ��3�Ĥ����Ǥ��Ǽ���뤳�Ȥ��Ǥ���ΤǤ���
���η�̡�°����3�İʲ��Υ��󥹥��󥹤� 64bit �Ķ��Ǥ� 96 �Х��Ȥ� dict ��°����������뤳�Ȥ��Ǥ���ΤǤ���
���� key sharing dict �ϡ� Python 3.4 ��Ƴ������ޤ����� (���ʤߤ� 3.4 �ǤϥХ��ǥ��֥��饹��Í���ˤʤ�ʤ��ä��Τ��� 3.4.1 �Dz�ä���ޤ�����
������Ũ�ʿ���ǽ���� dict ��ϥå����Ƥ����ͤ�ñ��˼�����ʣ���ˤ�����ͤ��ʤ��Ȥ����ʤ������������䤹�Ȥ��������Ǥʤ������ʤ�Ť���̣�Ƕ줷��뤳�Ȥˤʤ�ޤ���
�����äϼ���ε����Dz��⤷�ޤ���
@methane
���꡼���˲����˲��٤򥢥åפ��ޤ���
��ٻ�ġ���֥��꡼���˲��פ�������ޤ��� �ǾҲ𤷤����꡼���˲��Ǥ��������θ�� KLab ��ΰƷ�����Ѥ���Ĥ� ��ƻ�˶�������Ƥ��ޤ��� �Ƕᶯ�����줿����2�ľҲ𤷤ޤ���
���꡼���˲�(KLab/green-hakai)
ʬ������
�����Ҳ𤷤����Υ��꡼���˲��� fork ����ʣ���ץ��������鹶�⤹���������ä��ΤǤ����� execnet �Ȥ����饤�֥����Ѥ��Ƽºݤ˹����Ԥ������ץ��������������褦�ˤ��ޤ�����
execnet �� fork&exec �����Ǥʤ��� ssh ��ͳ�ǥ�⡼�ȥޥ����˳����ץ������� ��뤳�Ȥ��Ǥ��ޤ������꡼���˲��⤳������Ѥ���ʬ�����⤬�Ǥ���褦�ˤʤ�ޤ�����
����ե����� (YAML) �˼��Τ褦�ʥ���������񤯤ȡ����������2�ץ�������
attacker
�ۥ��Ⱦ�� 4 �ץ������ι��6�ץ��������鹶���ųݤ��뤳�Ȥ��Ǥ��ޤ���
#�˲��Ρ���
nodes:
- host: localhost # localhost �ξ��� ssh �ǤϤʤ��� popen ���ޤ�
proc: 2 # ���� host �ǵ�ư����ץ�������
- host: ghakai@attacker # ssh��
proc: 4
�������Ȥ��ơ������ۥ��Ⱦ�ǹ���ץ�������Ω���夲����⡢���꡼���˲���ư�����ޥ����Ʊ�� �ǥ��쥯�ȥ�ˤ��� Python �����Ѥ���Τǡ����꡼���˲��򥤥󥹥ȡ��뤷���ǥ��쥯�ȥ�� rsync ���ʤˤ���Ʊ�����Ƥ���ɬ�פ�����ޤ���
���꡼���˲��� AWS �ǻȤ���硢1���󥹥������������ǽ��ʪ���ޥ���ۤɤǤʤ� ���Ȥ�¿���Τǡ� Spot Instance ���Ȥ߹�碌�ƻȤ��Τ�������Ǥ���
̾�����
���Υ��꡼���˲������̤ˡ�̾�����䤤��碌�ơ���̤�夫����֤����Ѥ���Ȥ�������̾�����򤷤Ƥ��ޤ�����
�������� Keep-Alive ��̵���Υ����ӥ����Ф�����ٻ����Ȥ���̾����褬�ܥȥ�ͥå��ˤʤä��ꡢ AWS �� ELB �����Ѥ����ץ��������Ȥ��Ф�����ٻ����Ȥ��˥��������DNS����å���Τ����� ������IP���ɥ쥹��ʬ�����ʤ��ä��ꤹ�뤳�Ȥ�����ޤ�����
�����ǡ��ǽ��̾������¹Ԥ�������̤����ƳФ��Ƥ�������³������Ͼ夫���ǤϤʤ��� ����������Ѥ���Ȥ����������ѹ����ޤ�����
��������Ĺ���ֹ�����³�����硢 ELB ���������륢���Ȥ��Ƥ⥰�꡼���˲����ɽ����ޤ��� ��Ȥ�Ȳ�ǽ�ʸ¤� Keep-Alive �����ˡ���³���ڤ�Ƥ����³����̾�����򤷤ʤ�����Ǥ��� ELB ��ͳ����ٻ��Ԥ����ϡ����٥��꡼���˲���¹Ԥ��ƥ������ॢ�åפ��� ELB �򥹥����륢���Ȥ����Ƥ��顢���꡼���˲���Ƽ¹Ԥ��Ƥ���������
�ޤ����פä��褦����٤�������ʤ��ǥ쥹�ݥ󥹥����ब�㲼����Ȥ��� ELB ������� ���ץ��������ڤ�ʬ����Ȥ��� ELB �Υ������ॢ�åפ����ݤʤȤ��Τ��ᡢ���ʬ���� �̤���ľ�ܹ��⤹�뵡ǽ����ܤ��ޤ�����
����ե������ domain
�� addresslist
��ξ�����������ȡ���³��� addresslist
�������������Ф졢 HTTP �� Host �إå��ˤ� domain
�����Ƥ����Ҥ���ޤ���
#������Υɥᥤ��. ����ʳ��Υɥᥤ��Ϲ��⤷�ʤ�.
# Host �إå��ˤ��Υɥᥤ�󤬽񤫤��.
domain: "http://localhost:8889"
#��³�襢�ɥ쥹�ꥹ��. ��ά�������� domain �����Ѥ���.
addresslist:
- 127.0.0.1:8889
- localhost:8889
����� Google �ȼ������з衪 Go 1 vs PyPy
�����ץ��ա���ͥ����פ��Ĥ��ʤ�����4/1�ϵ����ʤ�����ꤢ��ޤ��� methane �Ǥ���
�Ȥ��Ȥ� ���� �ΥС������ 1 ����꡼������ޤ����͡�����ǤȤ��������ޤ��� �ޤ�RC2���ФƤ��餢�ޤ���֤��ФäƤʤ���������ΤǤ������ѥ�����˥��������ȼ�����ξι��å��줽���ˤʤäƹ��Ƥ��Τ��⤷��ޤ���
�����echo�����С��з� ����Ⱦǯ�������Фä��ΤǤ��������δ֤ˤɤ줯�餤��®�������Τ�����®�٥���ޡ����򥢥åץǡ��Ȥ��ޤ�����
echoserver on github
Google Docs Spreadsheet
����Υ���������Ӥ��Ƥߤ�ȡ� Go �� r59 �Ǥ�
Throughput: 52087.16 [#/sec] Throughput: 52070.02 [#/sec] Throughput: 52068.27 [#/sec]���ä��Τ��� Go 1 �Ǥ�
Throughput: 55872.09 [#/sec] Throughput: 55857.82 [#/sec] Throughput: 55949.57 [#/sec]�ȡ���̤���ư������ۤɤǤϤ���ޤ��󤬡���¤�®���ʤäƤޤ��������� PyPy 1.6�Ǥ�
Throughput: 79193.30 [#/sec] Throughput: 81063.83 [#/sec] Throughput: 81442.70 [#/sec]���ä��Τ��� PyPy 1.8 ���ȡ�����
Throughput: 84852.55 [#/sec] Throughput: 106760.88 [#/sec] Throughput: 107032.43 [#/sec]
�ʤ�ȡ����󥰥륹��åɤ�C++��epoll�ǡˤ�������ǽ��á���Ф��褦�ˤʤäƤޤ���
����� Go �� PyPy �����ι����Ǥ������ƤޤǤˤϷ��̥���åɺ�®�Ķ��Ǥ��� Haskell �ο����� Haskell Platform �Ȥ����ǥ����ȥ�ӥ塼����󤬽Ф�Ȼפ��Τǡ�������Ԥä�����Ū�˹����������Ȼפ��ޤ���
Ajax��ȯ�Υƥ��ȥġ���Ȥ��Ƥ�Python
KLab Advent Calendar 2011 ��DSAS for Social ��٤��뵻�ѡ� ��15���ܤǤ���
�Ƕ�ϥ�������륲����γ�ȯ�Ʒ�������Ƥ��ޤ�����Android/iOS���ץ�γ�ȯ��Ϥ���Ȥ���Ajax�̿��λ��㤬��¿���ʤꡢ��ȯ������������Ѥ�ꤷ�ĤĤ���ޤ���������Web�����ȡ�Web���ץ깽�ۤξ���PC����ӤΥ֥饦���������ɤ��ʤ�����ä��Τ������ޡ��ȥե��󤬲ä��ĤĤ���ޤ���
���ޡ��ȥե���ˤ����ƤϤ���˥��ץ곫ȯ���ç¤ï¿½Ê°ï¿½Ì£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä¤Ä¤ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó»ï¿½ï¿½ï¿½Ë¤ï¿½Java���ץ��BREW���ץ�ʤ�¿�ͤʥ��ץ꤬����ޤ����������ޡ��ȥե��󥢥ץ�Ǥΰ㤤�ϡ������ФȤ��̿�������¿���Ԥ��褦�ˤʤä����ȤǤ������饤����ȥ��ץ��¿���ξ�缫�����⤷����WebView���Ѥ����̿���Ajax���Ȥ��ޤ����ꥯ�����Ȥ�GET�����Ǥʤ�POST��Ȥ�����¿�����ꡢ�֥饦�������ǥ����г�ȯ���ǥХå���ʤ��Τϸ���������¿������ޤ���
����ʤ櫓�Ǻ���Ajax�̿���Ԥ���ñ�ʥƥ��ȥġ��뤬�ۤ����Ȼפäƾ���õ���Ƥߤ��ΤǤ�������Selenium�פȤ����֥饦���١����Υġ���ʳ���������ʤ��褦�Ǥ������䤬�ߤ����ä��Τ�ñ�˰���Ajax�ꥯ�����Ȥȥ쥹�ݥ󥹤Τ��줾����������ͤ򸡺����ơ������̤�ν���������Ƥ뤫�ɤ����򸫤����ä��ΤǤ�������������Ӥˤϥ����С����ڥå��Ǥ�����
�ǽ�ϥ����Ф�ư���ǧ�ˤ�wget��curl�Ȥ��ä����ޥ�ɥ饤��ġ������Ѥ��Ƥ��ޤ���������������Ū�����̳�ǧ��ץ�����ब���顼�ʤ�ư��뤫�ɤ������餤�ˤϻȤ��Ƥ⡢Ajax�쥹�ݥ󥹤�ʣ���ˤʤäƤ���ˤĤ�ƥ쥹�ݥ󥹤�JSON���ͤ����������������ɤ�����Ƚ��ϤǤ��ޤ����ܻ�Ǥγ�ǧ��³�������ޤ������饤����ȥ��ץ꤬���ä�ǧ���׵��������Ƚ�̤���OK/NG���֤����ɤ����Ȥ�������������å��Ȥ����������ͤ��֤����ɤ������ʤɤʤɡ���ȯ���ʤ�ˤĤ��Ajax�����ФιԤ�������ʣ�������ޤ��Τǡ����˥��ߡ����饤����ȡ������Хƥ����ѤΥ�����ץȤ������ߤ����Ȥ����Ǥ���
Python�ˤϥ�˥åȥƥ��ȥ⥸�塼��unittest��ɸ��饤�֥��Ȥ����Ȥ߹��ޤ�Ƥ��ޤ��������HTTP�̿���Ԥ�urllib2��json�⥸�塼���ɸ��Ǥ��Τǡ��������Ȥ߹�碌���Ajax�����Фγ�ȯ���Ϥ˱��뤳�Ȥ��Ǥ��ޤ���
import urllib2 import json import unittest session = 'xxxxxxxx' url = 'http://foo.bar/apps/?p={"session_id":"%s","action":"%s","params":"%s"}' class TestAjaxProcess(unittest.TestCase): def test01(self): f = urllib2.urlopen(url % (session, 'hoge_action', 1)) result = json.loads(f.read()) print result # Ajax�쥹�ݥ󥹤ˤ� { "result":"ok", "data":{"response_code":1, ... }} �Τ褦�����Ƥ����� self.assertEqual(result['result'], 'ok') self.assertEqual(result['data']['response_code'], 1) def test02(self): f = urllib2.urlopen(url % (session, 'hoge_action', 2)) result = json.loads(f.read()) print result # Ajax�쥹�ݥ󥹤ˤ� { "result":"ng", "data":{"message": }} �Τ褦�����Ƥ����� self.assertEqual(result['result'], 'ng') self.assertEqual(result['data']['message'], '"params" invalid') if __name__ == '__main__': unittest.main()
����ư����Ǥ���
$ python tester.py { u'result':u'ok', u'data': {u'response_code": 1, u'value':100, u'extra_comment': u'hogehoge' }} { u'result':u'ng', u'data': {u'message': u'"params" invalid' }} .. ---------------------------------------------------------------------- Ran 2 tests in 0.160s OK
ɸ��饤�֥�꤬���¤���������ץȸ���Ǥ���С����Τ褦��Ajax�ƥ��ȥ�����ץȤ��ưפ��Ȥ�ޤ������ᤤ����������ѹ�������볫ȯ����ˤ����ơ���������Ajax�ƥ��ȴĶ���·���Ƥ������Ȥϡ����夵��˽����٤��������Ǥ��礦��
���������������ȥޥåפ������� �����Υ����ǡ������Ѥ������
�����iPhone�˥ǡ��������Ѥδʰץ��ץ���ä�������ߡ���¬�����Ȥ����ޤǤǤҤȤޤ������Ȥ������ǡ����ϼ�ä�����ˤϻȤ�ʤ���С����Υ����ǡ������Ѥ����롣�ޤ����˺��������긵�Υ������ǧ���Ƥߤ����櫓�Ǥ��衣
����PING��̤��Ͽ޾��ɽ�����������⤦��ö�ե�������¸������Τ�����PC���Google Maps����Ѥ���Τ��Ǥ��ñ�����ʤΤǤ���ǽФ����Ȥˤ��������ȤϤ��Υ����ǡ�����ɤΤ褦���ݻ����뤫������Web���ץ���Ϥ���AJAXŪ�˥��饤����Ȥ�������褦�ˤ������ȹͤ��Ƥ��롣����ʤ�Хǡ�����DB�ˤ��ޤäơ�Web���ץ�ˤ�������Ф����Ϥˤ����������ҤȤޤ�JSON����Ū�ե�����ˤ����н褹��Ȥ����ʳ�Ū�ʼ������б����롣
����ʤ櫓�ǡ������ե�����βù�����������"LocationPinger[1785:307]"�䡢"latitude"��"longitude"�Ȥ��ä���Ĺ�ʸ���ޤ��Ͻ���롣�����Ǥ��Υ����ˤϰ��־����PING��2���ब���äƤ���Τǡ����줾�����̤��䤹�����롣������CSV�����˽स�ƥץ�����������ߤ䤹�������ˤ��褦��
% sed -e 's/ LocationPinger[[^]]*]/,/' -e 's/latitude /latlng,/' -e 's/longitude //' -e 's/, #/,ping,/' -e 's/ sent/, sent/' -e 's/ received/, received/' -e 's/ send/ , send/' -e 's/, /,/g' < (log file)
CSV��2������ܤˡ�PING=ping�Ȱ��־���=laglng�Ȥ������줾��ζ��̤򼨤��������ɲä�����
�ޤ�����1����ब����ΤޤޤˤʤäƤ��뤬�������ǡ����ε�Ͽ���ϻ�����������л��֤��֤������롣�ʤ�����ʤ��Ȥ򤹤뤫�ȸ����ȡ����־����������֤��뤿�����
def at_location(t): i = 0 while t > locations[i + 1][0] and i + 1 < len(locations): i += 1 (t0, p0, q0) = locations[i] (t1, p1, q1) = locations[i + 1] dt = t1 - t0 dp = p1 - p0 dq = q1 - q0 return (p0 + dp * (t - t0) / dt, q0 + dq * (t - t0) / dt)
���������󿷴����Ȥ�����®��ư���ʤ���Υǡ��������Ȥʤ뤿�ᡢ0����޲��äδֳ֤Ǥ��äƤ⤫�ʤ�ε�Υ���ư���Ƥ���׻��ˤʤ롣�Ǥ�ᤤlatlng�Υǡ����Ǵ֤˹�碌�Ƥ⤤���������٤Ƥ�latlng�ǡ����ˤϥ����ॹ����פ����뤳�Ȥ�ͤ���С����Υ����ॹ����פ����Ϥˤ����ؿ� x = f(t), y = g(t)
���������С�Ǥ�դλ����Ǥΰ��֤򤽤������μ�֤Ƿ׻��Ǥ��뤳�Ȥˤʤ롣�������Τ�(����)��֤���
import datetime import sys f = sys.stdin dt0 = None def __read_datetime(s): dt0 = s.split(' ') dt1 = dt0[1].split('.') fd = dt0[0].split('-') ft = dt1[0].split(':') da = [int(x) for x in fd + ft + [dt1[1] + '000']] dt = datetime.datetime(*da) return dt for line in f.readlines(): line = line.rstrip() fs = line.split(',', 2) dt = __read_datetime(fs[0]) if not dt0: dt0 = dt d = dt - dt0 print "%d,%s,%s" % (d.seconds * 1000 + d.microseconds / 1000, fs[1], fs[2])
�����ޤǤǥ����ǡ�������������ʬ�ʤ��������ˤ����ץ��������ǰ����٤Υǡ�����¤�˹�碌�ƺ��������롣�ǽ�Υ�����������1��ʬ��ñ�̤Ȥ����ݻ������褿����PING�������ȼ��������줾��ɳ�Ť��Ƥ���Τǡ��б��������Ʊ�Τ�ޤȤ�ƿ����ʰ�ĤΥǡ���ñ�̤Ȥʤ�褦�ˤ�������
for line in sys.stdin.readlines(): line = line.rstrip() fs = line.split(',') fs[0] = long(fs[0]) if fs[1] == 'ping': d = None fs[2] = int(fs[2]) if fs[2] in pings: d = pings[fs[2]] else: d = {} pings[fs[2]] = d if fs[3] in ('sent', 'received'): d[fs[3]] = fs[0] elif fs[1] == 'latlng': locations += [(fs[0], float(fs[2]), float(fs[3]))]
"ping"�ιԤ���3������PING�������������󥹤��ֹ�򼨤��Ƥ��롣"if fs[1] == 'ping':"�ι԰ʹߤǡ�Ʊ��Υ��������ֹ�����"sent"��"received"���Ȥ��ꡢ��Ĥ�Ϣ������Ȥ��ƤޤȤ�Ƥ��롣�ޤȤ᤿Ϣ������ϡ������pings������༡�ɲä��Ƥ��롣
����ˡ����־���Υ���ȥ����ֽ��locations���������ơ����Ҥ�������֤Τ���Υǡ����Ȥ��ƻȤä���PING�������Τ��줾�쥿���ॹ����פ���Ѥ��Ƴƻ����Ǥΰ��־������ꤷ�Ƽ��������
for k in pings: p = pings[k] if 'sent' in p: p['sent'] = (p['sent'],) + at_location(p['sent']) if 'received' in p: p['received'] = (p['received'],) + at_location(p['received'])
���Ȥϡ��������Ĥ�JSON���Ϥˤ��ƽ���夬��Ǥ��롣
result = {"locations":locations, "events":list(pings[k] for k in sorted(pings.keys())) } print json.dumps(result)
{"locations": [ [0, 39.158541999999997, 141.18367799999999], [606, 39.149102999999997, 141.187062], [1641, 39.149863000000003, 141.18681799999999], [2629, 39.150553000000002, 141.186599], [4189, 39.151201, 141.18638999999999], [4668, 39.151829999999997, 141.18618599999999], ... ], "pings": [ {"received": [734, 39.149196990338162, 141.18703182415459], "sent": [581, 39.149492397689762, 141.18692239603959]}, {"received": [1689, 39.149896522267213, 141.18680736032388], "sent": [1584, 39.149821144927536, 141.18683143768115]}, {"received": [2696, 39.150580830769236, 141.18659002371794], "sent": [2584, 39.150521572874496, 141.18660897469636]}, {"received": [3674, 39.15098707692308, 141.18645899679487], "sent": [3584, 39.150949692307691, 141.18647105448719]}, {"received": [4757, 39.151889238247861, 141.18616726816239], "sent": [4584, 39.151719695198324, 141.18622177453025]}, {"received": [5766, 39.152556356000005, 141.18595579000001], "sent": [5584, 39.152439688034192, 141.18599320940172]}, ... ]}
���������褤�褳���Ȥä�Google Maps���ɽ�����Ƥߤ褦����ʤ��Ǥ�����
<html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript" src="jquery-1.5.1.min.js"></script> <script type="text/javascript"> var map = null; function initialize() { var y = (39.158542 + 39.701141) / 2; var x = (141.183678 + 141.136431) / 2; var latlng = new google.maps.LatLng(y, x); var myOptions = { zoom: 10, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); } $(document).ready(function() { initialize(); $.ajax({ url: 'pinglog.json', type: 'GET', dataType: 'json', success: function(data) { $.each(data['events'], function(i, ev) { var loc0 = null, loc1 = null, t0 = null, t1 = null, thickness = 1; if ('sent' in ev) { loc0 = new google.maps.LatLng(ev['sent'][1], ev['sent'][2]); t0 = ev['sent'][0]; } if ('received' in ev) { loc1 = new google.maps.LatLng(ev['received'][1], ev['received'][2]); t1 = ev['received'][0]; } if (loc0 != null && loc1 != null) { var dt = t1 - t0; if (dt <= 100) { thickness = 20; } else if (dt <= 200) { thickness = 12; } else if (dt <= 400) { thickness = 7; } else if (dt <= 1000) { thickness = 4; } else if (dt <= 2000) { thickness = 2; } var path = new google.maps.Polyline({ path: [loc0, loc1], strokeColor: "#FF0000", strokeOpacity: 1.0, strokeWeight: thickness }); path.setMap(map); google.maps.event.addListener(path, 'click', function() { alert('clicked') }); } }); } }); }); </script> </head> <body> <div id="map_canvas"></div> </body> </html>
���ޤ��������ޤ����賧����
���̤���ǧ�Ǥ����ս�Ǥ�PING������������������������������ޤǤδ֤�����������Ƥ��ꡢRTT�λ��֤�û�����û�����������ˤ��Ƥ��롣����Ǹ���ȡ��������ɱؤ��������ؤޤǤδ֡����ͤɤ��Ǥ�Softbank 3G�����Ȥ򽦤��Ƥ������Ȥ�ʬ���롣�����������礦�ɲִ��ԤΤ�����ǤϤä�����򤬤Ǥ��Ƥ��롣����ϡ����ִ�����¦�ˤ���ִ��ȥ�ͥ�ȹ⾾�ȥ�ͥ�Ȥ�����ĤΥȥ�ͥ�Τ��������Ȥ��Ϥ��ʤ��ʤä�����Ǥ��ꡢ�ޤ�����ξ�ȥ�ͥ�֤��Ͼ������֤ˤϥͥåȥ������ã���������Ǥ��ʤ��ä����Ȥ��̣���Ƥ��롣�����餯�������ְ�ư�ʤɤǷ�¬����аۤʤ��̤��Ф���������Ȥ���¬����롣
�ޤ���¾�ˤ�ȥ�ͥ�Ȥϴط��ʤ��꡹PING��̤��ץ��åȤ���Ƥ��ʤ��ս꤬���뤳�Ȥ�ʬ����Ȼפ����Ҷ��̿��ȽŤ͹�碌�Ƹ���ȡ��ͲȤ����ڤ쵤̣�ˤʤä��꿹�����Ӥ��ä��ꤷ�Ƥ��ơ����϶ɤ���󤫤ä��Τ��Ȥ��ɴ֤Υϥ�ɥ����С��˼��Ԥ����Τ��������Ȥ�������������¬���Ƥߤ�Τ����򤤤����������ʤߤˡ��������ɤ����ء��������̤˸������Ȥ�äȥȥ�ͥ뤬¿���Τǡ������ư��¿����������Τ���ǡ��������뤳�Ȥ�����������ɤ��Ȥ��Ϥ�ä��Ѱդ�ʤ�Ƥ�����Ǥ�ǡ���������褦�ˤ��Ƥ��������Ȥ�����
�Ȥ����櫓�ǡ������ޤǤǥǡ����ε�Ͽ�Ƚ��ϤϤǤ���褦�ˤʤä������饤����ȥ����ɤ�ư��ڥ�ǥ뤬���褿���Ȥˤʤ롣�Ĥ�ϥ����ФؤΥǡ������ѡ����������äƸ������餤�ʤ�Ǥ����餵���������󡢳�������ͤ�ϡ����äȡ����äȡ��������ƤĤʤ��äƤ����櫓�Ǥ��褪�����������ļ���Ϥ��褤�褽�Τؤ�ε�ǽ��������ޤ����ɤΤؤ�
(������ �Ҥ��Τ�)
Python�Υץ��ե������̤�GUI�Dz��Ϥ���
�פ��֤�Υ������ѡ���Python�ץ�����ߥ���Â�����Ǥ�������ϥץ��ե�����󥰤���Â�Ǥ���
Python��ɸ��饤�֥��˥ץ��ե�����(profile/cProfile�⥸�塼���Profile���饹)����äƤ��ơ� ���η�̤��Ǽ���Ƥ���pstats.Stats���饹�ˤϥץ��ե������̤���Ϥ���Τ�ɬ�פʵ�ǽ(�¹Ի��֤ǤΥ����Ȥ䡢�ƤӽФ������ƤӽФ����ɽ���ʤ�)�����̤ꤽ���äƤ��ޤ��������Υ��饹�ˤĤ��Ƥϥ������ѡ���Python�ץ�����ߥ󥰤ǻȤ�������⤷�Ƥ���ޤ���
���ޥ�ɥ饤��Ǻ�Ȥ���Ȥ��ˤ�IPython����Stats���֥������Ȥ�ľ�����ƥץ��ե������̤�Ĵ�٤���ΤǤ�������Ϥ�ץ��ե������̤ϥ���ե������ɽ�����Ƥ��줿�������䤹����ΤǤ����äˡ֥������ѡ���Python�ץ�����ߥ󥰡פ���Ǥ���ڤ���Ƥ���KCacheGrind�Ȥ���GUI�ġ�������˶��Ϥǡ����ٻȤ��ȼ������ޤ���
KCacheGrind���б����Ƥ���callgrind�����ϡ�������Valgrind�Υġ���ΰ�ĤǤ���Callgrind�Τ�ΤǤ������� �Ƕ�ϥץ��ե������̤���¸����ե����ޥåȤȤ��ƹ����Ѥ����Ƥ��ޤ���callgrind�����ե�����Υ֥饦���Ȥ��Ƥ�KCacheGrind�ʳ��ˤ⡢Windows��ư��WinCacheGrind��PHP���ǥ֥饦�����ɽ������webgrind ��������ޤ�����PHP��xdebug�˴ޤޤ��ץ��ե������callgrind�����ǥץ��ե������̤���¸���ޤ���
���ҤǤ�����Ū��callgrind�����Υץ��ե������̤�Í���Ƥ��ơ����Τ���˼����Web�ġ���ޤ��Ѱդ��Ƥ��ޤ���(�Ҳðµ»ï¿½: PHP Xdebug ��Profile�μ�ڤʶ�Í�ġ�����ä���)
��������Stats���饹��callgrind�����ˤ��б����Ƥ��餺���ץ��ե������̤���¸����Ȥ��Υե�����ե����ޥåȤ��ȼ��ե����ޥå�(Stats�������ѿ���marshal��������¸�������)�ˤʤäƤ��ޤ������ΤޤޤǤϡ�Python�Υץ��ե������̤�KCacheGrind��ɽ�����뤳�Ȥ��Ǥ��ޤ��� �����ǡ�Stats���֥������Ȥ�callgrind��������¸���뤿���lsprofcalltree.py�����Ѥ��ޤ���
lsprofcalltree.py�ϡ����ޥ�ɥ饤��ġ���Ȥ��� $ lsprofcalltree.py ������ץȥե�����
�Ȥ����Ȥ�����Ǥ��ޤ��������ץꥱ���������Ȥ߹���ǻȤ����Ȥ�Ǥ��ޤ����㤨��Bazaar�Ǥ� $ bzr --lsprof-file callgrind.out status
�Τ褦�˼¹Ԥ���ȥץ��ե������̤�callgrind�����ǽ��Ϥ���褦�ˤʤäƤ��ޤ���
�ץ��ե������̤򸫤䤹���ӥ��奢�饤���Ǥ���Ķ��������ȡ����ץꥱ�������Υ��塼�˥󥰤��ڤ����ʤ�ޤ��� KCacheGrind����GUI�ġ����callgrind�����Υե��������Ϥ���ץ��ե�����ϡ�Python�ץ�����ޤ˸¤餺�ߤ�ʾ������Ƥ����Ȥ����Ȼפ��ޤ���
Twisted vs Tornado vs Go ����Ʊ��Web�����С��з�
������ takada-at �ε����ǡ֥����С�¦�Ǥ�ñ���100ms�ԤäƤ���쥹�ݥ󥹤��֤������Υڡ������Ѱդ��Ƥ������פȤ��ä��ΤǤ����������Ϥ��Υ����С�¦���ä򤷤ޤ���
��Ȥ�Ȥ��Υ����С����ä�ư���ϡ�takada-at �����������ٻ�����ƥब�������������٤򤫤����뤫�ɤ����򸡾ڤ��뤿��Ǥ����� �����˥쥹�ݥ󥹤��֤��Ƥ��ޤ��ȡ���ٻ������ץȤ���������������٤򤫤����ʤ��Ƥ� PV/sec ���ФƤ��ޤ��ޤ��� �����ǡ� epoll ��Ȥäƹ�®��������³�򰷤���Twisted�ե졼������Ȥäơ�100ms���ٱ�򤷤ĤĿ���PV/sec���Ѥ���Web�����С����äƤߤޤ����� ����ˡ�Ʊ���� epoll ��ȤäƤ��� Tornado �� Go �ˤⶽ̣�����ä��Τǡ�������Ǥ�Ʊ����Τ���������ѥե����ޥ󥹤���Ӥ��Ƥߤޤ�����
������
�ޤ��ϡ������ɤ򸫤Ƥߤޤ��礦��
Twisted Python:
from twisted.internet import epollreactor epollreactor.install() from twisted.web import server, resource from twisted.internet import reactor class Lazy(resource.Resource): isLeaf = True def __init__(self, delay=0.1): self._delay = delay def render_GET(self, request): def after(): request.write('Hello, World!') request.finish() reactor.callLater(self._delay, after) return server.NOT_DONE_YET if __name__ == '__main__': import sys delay = 0.1 try: delay = float(sys.argv[1]) / 1000 except Exception: pass site = server.Site(Lazy(delay)) reactor.listenTCP(8000, site) reactor.run()
���ϡ�Tornado�Ǥ���
from tornado import httpserver, ioloop, web from time import time DELAY = 0.1 class MainHandler(web.RequestHandler): @web.asynchronous def get(self): def _hello(): self.write("Hello, World!") self.finish() ioloop.IOLoop.instance().add_timeout(time() + DELAY, _hello) application = web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": import sys try: DELAY = float(sys.argv[1]) / 1000 except Exception: pass http_server = httpserver.HTTPServer(application) http_server.listen(8001) ioloop.IOLoop.instance().start()
�Ǹ�ˡ�Go�Ǥ���
package main import ( "flag" "http" "io" "log" "time" ) var addr = flag.String("addr", ":9000", "http service address") var delay = flag.Int64("delay", 100, "response delay[ms]") func main() { flag.Int64Var(delay, "d", 100, "response delay[ms]") flag.Parse() http.Handle("/", http.HandlerFunc(hello)) err := http.ListenAndServe(*addr, nil) if err != nil { log.Exit("ListenAndServe:", err) } } func hello(c *http.Conn, req *http.Request) { time.Sleep(int64(1000000) * int64(*delay)) io.WriteString(c, "Hello, World!\n") }
Twisted��Tornado�ϡ��롼�פ˸�ǸƤӽФ��ؿ�����Ͽ���Ƥ��Ƥ������餫�˥��٥�ȥɥ�֥�ե졼�����Ȥ������������ޤ��� ������Ф���Go�� Sleep() ��ȤäƤ��ơ��츫���̤Υ���åɤ١�������������˸����ޤ��� ��������Go�ϥͥ��ƥ��֥���åɤǤϤʤ�goroutine�Ȥ������̤ʥ桼�������ɥ���åɤ����Ѥ��Ƥ��ꡢ���Υ������塼��ϡ�Linux�ξ���epoll�����Ѥ��Ƥ��ޤ����̾�Υ���åɤ�Ȥ������ΨŪ��ư���Ϥ��Ǥ���
�٥���ޡ���
����Ǥϡ�����3�Ĥˤ��줾����٤򤫤��Ƥߤޤ��礦���Ȥ��äƤ⡢100ms���ٱ������٤򤫤���Τ����ѤʤΤǡ�10ms���ٱ�Ǽ¹Ԥ���ab -c100 -n10000�Ǽ¸����Ƥߤޤ���
Twisted: Requests per second: 2620.31 [#/sec] (mean) Time per request: 38.163 [ms] (mean) Time per request: 0.382 [ms] (mean, across all concurrent requests) Percentage of the requests served within a certain time (ms) 50% 31 66% 32 75% 33 80% 37 90% 38 95% 38 98% 40 99% 44 100% 3082 (longest request) Tornado: Requests per second: 5299.04 [#/sec] (mean) Time per request: 18.871 [ms] (mean) Time per request: 0.189 [ms] (mean, across all concurrent requests) Percentage of the requests served within a certain time (ms) 50% 19 66% 19 75% 19 80% 19 90% 19 95% 19 98% 21 99% 22 100% 33 (longest request) Go: Requests per second: 4712.63 [#/sec] (mean) Time per request: 21.220 [ms] (mean) Time per request: 0.212 [ms] (mean, across all concurrent requests) Percentage of the requests served within a certain time (ms) 50% 19 66% 20 75% 20 80% 21 90% 32 95% 40 98% 42 99% 42 100% 48 (longest request)
Tornado��Go����٤�ȡ�Twisted����ǰ�ʷ�̤ˤʤäƤ��ޤ��� ����ϡ�Twisted�����Ū����Ū�ǹⵡǽ�ʥե졼�����Ȥ������Ȥ⤢��ޤ������ٱ�¹Ԥ���ؿ���ꥹ�Ȥ˳�Ǽ���Ƥ��ơ��¹Ԥ���ؿ������뤫�ɤ�����ꥹ�Ȥ����������å����Ƥ���Τ��ç¤ï¿½ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½Tornado�ϥ����ȺѤߥꥹ�Ȥ����Ѥ��Ƥ��Ƥޤ���
Go�⡢����ѥ��鷿�ʤΤ�Tornado���餱�Ƥ�Τ���ǰ�Ǥ�����epoll����ľ�ܥ��٥�ȥɥ�֥󤷤Ƥ���Tornado����٤�� goroutine �Ȥ�����ݲ��쥤���1��Ϥ���Ǥ���Τǻ����ʤ����⤷��ޤ���
����˹�®��
�ޤ���Tornado��JIT�ˤ���®����ĩ�路�Ƥߤޤ���PyPy-1.2�����֤褵�����Ǥ��������åȥ��åפ����ݤʤΤǤ���ڤ�psyco��ȤäƤߤޤ�������ȤΥ����������ɤˡ�����2�Ԥ��ɲä��ޤ���
import psyco psyco.full()
��̤Ϥ����ʤ�ޤ�����
Requests per second: 7503.16 [#/sec] (mean) Time per request: 13.328 [ms] (mean) Time per request: 0.133 [ms] (mean, across all concurrent requests) Percentage of the requests served within a certain time (ms) 50% 13 66% 13 75% 14 80% 14 90% 14 95% 14 98% 15 99% 15 100% 23 (longest request)
5299req/sec => 7503req/sec �ǡ�20��ʾ��®���Ǥ��ޤ�����top�Ǹ��Ƥ���¤ꡢ���������(RES)��1MB�ʲ��Ǥ���Tornado+psyco������ͥ���Ǥ��͡�
���ˡ�Go�ǥޥ������åɲ����Ƥߤޤ���goroutine��ʣ���Υͥ��ƥ��֥���åɤ����Ѥ��������ư��뤳�Ȥ��Ǥ��ޤ������������������ǤϤޤ��������塼�餬�褯�ʤ��餷�����ǥե���ȤǤϥޥ������åɤ�Ȥ�ʤ��褦�ˤʤäƤ��ޤ����Ķ��ѿ� GOMAXPROCS �����������ꤷ�Ƽ¸����Ƥߤޤ�����
GOMAXPROCS=6 ��: Requests per second: 5760.33 [#/sec] (mean) Time per request: 17.360 [ms] (mean) Time per request: 0.174 [ms] (mean, across all concurrent requests) Percentage of the requests served within a certain time (ms) 50% 16 66% 17 75% 17 80% 18 90% 28 95% 33 98% 37 99% 40 100% 53 (longest request)
�¸��ޥ����Core2 Duo��2���������ܤäƤ��ʤ�(Hyper Threading��ʤ�)�ʤΤǤ�����2����ꤷ�Ƥ⤢�ޤ���ǽ���夬�餺����������1�Ĥ��Ŀ�����夲�Ƥ��ä��Ȥ���6�ޤǤϾ���������ǽ�����夷�Ƥ����ޤ����������⡢top�򸫤Ƥ���¤�CPU����Ψ�Ϻ����200%�ˤ������Ϥ���120%�ʲ��������ѤǤ��Ƥ��ޤ��� CPU�򸶰���Ƚ��ޤ��󤬡�����Τ褦�ʥ��٥�ȥ롼�פ�إӡ��˻Ȥ����Ӥˤϥ������塼�餬��Ŭ������Ƥ��餺����äȥ����С�¦��CPU�����Ѥ���׻���Ԥ������򤷤ʤ��ȥޥ��������Ȥ�����ʤ��Τ��⤷��ޤ���
Go�Ϻ���Υ������Ǥ�Tornado���餱�Ƥ��ޤ��ޤ�������IO¿�Ų��򥤥٥�ȥɥ�֥��ꥷ��ץ�˵��ҤǤ�������ѥ��뷿����ʤΤ�ʣ���ʷ׻���Python��갵��Ū�˹�®�˷׻��Ǥ������ʤΤǡ����˴��Ԥ��Ƥ��ޤ���
Python������ɽ���Ϥʤ�®����
�֥������ѡ���Python�ץ�����ߥ󥰡פ�ȯ�䤬��Amazon������ν�Ź�ǻϤޤ�ޤ�����

���ԡ�Tarek Ziade
���丵��������������ǥ��������
ȯ������2010-05-28
�������ߤ򸫤�
����ϡ��֥������ѡ���Python�ץ�����ߥ󥰡פ�2�Ϥ��顢�ꥹ������ɽ���ˤĤ�����Â���ޤ��� �ܽ�ǡ��ꥹ������ɽ����®����ͳ�ˤĤ��ơ����Τ褦��������ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
�������ꥹ�Ȥ����Ǥ� append() �����硢���󥿥ץ꥿�ϡ֥ꥹ�Ȥ��� append °������Ф��Ƥ����ؿ��Ȥ��ƸƤӽФ��פȤ��������򤷤ʤ���Фʤ�ޤ��� ������Ф��ơ��ꥹ������ɽ����Ȥ��ȡ����󥿥ץ꥿��ľ�ܡ֥ꥹ�Ȥ����Ǥ��ɲä���פȤ��������򤵤��뤳�Ȥ��Ǥ��ޤ������󥿥ץ꥿����᤹��̿��������롢°���μ��Ф������פˤʤ롢�ؿ��ƤӽФ������פˤʤ롢�Ȥ���3�Ĥ���ͳ�ǡ��ꥹ������ɽ����Ȥ���®���ʤ�ޤ���
����Ϥ������������ƤˤĤ��ơ��ܤ������Ƥ����ޤ��礦�������ʤ�Ǥ���������ɽ����Ȥ��ؿ��ȻȤ�ʤ��ؿ����Ѱդ��ơ��¹�®�٤ȥХ��ȥ����ɤ���Ӥ��Ƥߤޤ���
In [1]: def sample_loop(n): ...: L = [] ...: for i in xrange(n): ...: L.append(i) ...: return L ...: In [2]: def sample_comprehension(n): ...: return [i for i in xrange(n)] ...: In [3]: %timeit sample_loop(10000) 1000 loops, best of 3: 1.03 ms per loop In [4]: %timeit sample_comprehension(10000) 1000 loops, best of 3: 497 us per loop In [5]: from dis import dis In [6]: dis(sample_loop) 2 0 BUILD_LIST 0 3 STORE_FAST 1 (L) 3 6 SETUP_LOOP 33 (to 42) 9 LOAD_GLOBAL 0 (xrange) 12 LOAD_FAST 0 (n) 15 CALL_FUNCTION 1 18 GET_ITER >> 19 FOR_ITER 19 (to 41) 22 STORE_FAST 2 (i) 4 25 LOAD_FAST 1 (L) 28 LOAD_ATTR 1 (append) 31 LOAD_FAST 2 (i) 34 CALL_FUNCTION 1 37 POP_TOP 38 JUMP_ABSOLUTE 19 >> 41 POP_BLOCK 5 >> 42 LOAD_FAST 1 (L) 45 RETURN_VALUE In [7]: dis(sample_comprehension) 2 0 BUILD_LIST 0 3 DUP_TOP 4 STORE_FAST 1 (_[1]) 7 LOAD_GLOBAL 0 (xrange) 10 LOAD_FAST 0 (n) 13 CALL_FUNCTION 1 16 GET_ITER >> 17 FOR_ITER 13 (to 33) 20 STORE_FAST 2 (i) 23 LOAD_FAST 1 (_[1]) 26 LOAD_FAST 2 (i) 29 LIST_APPEND 30 JUMP_ABSOLUTE 17 >> 33 DELETE_FAST 1 (_[1]) 36 RETURN_VALUE
�¹�®�٤ϡ��ꥹ������ɽ���������ܰʾ�®���Ǥ��͡� �Х��ȥ����ɤˤĤ��ƤϾܤ����ϲ��⤷�ޤ��󤬡� sample_loop�� "19 FOR_ITER" ���� "38 JUMP_ABSOLUTE" �ޤǤ�8̿�ᡢsample_comprehension�� "17 FOR_ITER" ���� "30 JUMP_ABSOLUTE" �ޤǤ�6̿�᤬�롼�פˤʤäƤ��ޤ��� ���󥿥ץ꥿�Ϥ�����̿����ɤ߹���Ǽ¹ԤȤ����롼�פ�ԤäƤ���Τǡ��ޤ���̿����κ︺����®������ͳ��1�Ĥˤʤ�ޤ��� ����ˡ��롼�פ���ν����ˤĤ��Ƹ��Ƥ����ޤ��礦��
1. append°���μ��Ф�
sample_loop �ΥХ��ȥ����ɤǡ� "23 LOAD_ATTR" �Ȥ�����ʬ���� "L" �Ȥ����ѿ���������ɤ������֥������Ȥ��� "append" �Ȥ���°������Ф��Ƥ��ޤ��� °���λ��Ȥ��ɤ줯�餤�Ť������ʤΤ��� °���λ��ȤϤ���ʤ�ˡֽŤ��׽����Ǥ�����ˡ� append °���λ��Ȥ�롼�פγ����ɤ��Ф��Ƥߤޤ��礦��
In [19]: def sample_loop2(n): ....: L = [] ....: append = L.append ....: for i in xrange(n): ....: append(i) ....: return L ....: In [20]: %timeit sample_loop2(10000) 1000 loops, best of 3: 549 us per loop
�ꥹ������ɽ�������Ѥ���������٤�1�����٤����٤�����ޤ��󡣼¤ϡ����Υ����ɤΥ����С��إåɤ���Ⱦ�ϡ�append°���λ��Ȥˤ��ä��Ȥ������ˤʤ�ޤ���
���ʤߤˡ��Х��ȥ����ɤϺܤ��Ƥ��ޤ��󤬡�LOAD_ATTR��̵���ʤä�ʬ̿�����8̿�ᤫ��7̿��˺︺����Ƥ��ޤ���
2. �ؿ��θƤӽФ�
�ꥹ������ɽ����®���Ĥ�1�����ͳ�ϡ� "29 LIST_APPEND" �Ȥ���̿��ˤ���ޤ���
����ɽ����Ȥ�ʤ����ϡ� "13 CALL_FUNCTION" �ˤ�äơ� append ���Python�δؿ��Ȥ��Ƽ¹ԡפ���ɬ�פ�����ޤ������Ρ�Python�δؿ��Ȥ��Ƽ¹ԡפȤ����Τϡ� �����å���������ꥹ�Ȥ��������ɬ�פ����ä��ꡢ�ƤӽФ����ؿ������ǰ����Υ����å��򤷤Ƥ����ꡢ�ؿ�������ͤν���("37 POP_BACK" �ʤ�)��ɬ�פˤʤ�ޤ���
������Ф��ơ� "LIST_APPEND" �Ȥ���̿��ϥꥹ�ȥ��֥������Ȥ����Ǥ��ɲä������Ѥ�̿��ʤΤǡ������Ǥϥꥹ�Ȥؤ����Ǥ��ɲäΤߤ��Ԥ���褦�ˤʤ�ޤ���
�ޤȤ�
�ꥹ������ɽ����Ȥ���®���ʤ���Ȥߤ򡢥Х��ȥ����ɥ�٥�Dz��⤷�ޤ�������äȲ��ޤ��Τꤿ�����ϡ�Python�Υ����������ɤ� ceval.c �Ȥ����ե����뤫�顢 CALL_FUNCTION �� LIST_APPEND �ν����򤷤Ƥ�����ʬ���ɤäƤߤƤ���������
�ޤ���®���ʤ���ͳ����Ⱦ�ϡ�°���λ��ȥ����Ȥˤ���ޤ��������Υ����Ȥϡ�����ɽ����Ȥ�ʤ��Ƥ⡢�᥽�åɤ�롼�פμ����ǥ��������ѿ�����������Ȥ����ƥ��˥å��Ǥ����Ǥ��ޤ������Υƥ��˥å��ϥꥹ�Ȥ�append�᥽�åɰʳ��ˤ�Ǥ�դ�°�������ѤǤ���Τǡ��ܥȥ�ͥå��ˤʤ뤫�⤷��ʤ��롼�פ�񤯤Ȥ��ˤ��Ѷ�Ū�����Ѥ��ޤ��礦��
Windows��fopen��ȤäƤϤ����ʤ�!?
Windows�Ķ���svn+ssh:// ����� bzr branch �˼��Ԥ���Ȥ�����𤬤��ꡢĴ�٤Ƥߤ��Ȥ������򤤤��Ȥ�Ƚ�ä��Τǵ����ˤ��Ƥ����ޤ���
�ޤ���bzr-svn��subvertpy�Ȥ���libsvn�ΥХ���ǥ��󥰤����Ѥ��Ƥ��ơ�svn+ssh://�ץ��ȥ���Υϥ�ɥ�󥰤�libsvn���ԤäƤ��ޤ��� ���Τ��ᡢbzr+ssh://�Ǥ�Python����SSH���饤����ȤǤ���paramiko�����Ѥ��Ƥ���Ķ��Ǥ⡢svn+ssh://�ξ���libsvn��ssh.exe��SVN_SSH�Ķ��ѿ������ꤵ�줿ssh���饤����Ȥ�ư���Ƥ��ޤ��� ���putty�����Ѥ��Ƥ���Τǡ�SVN_SSH=plink�����ꤷ��svn+ssh�����ѤǤ���Ķ����Ѱդ������꤬�Ƹ����뤳�Ȥ��ǧ���ޤ�����
������ȥ졼���Хå����ɤäƤߤ��Ȥ���������ե�������ۤ���ݤ˰���ե�����˽ñ¤¹ï¿½ï¿½ß¤ï¿½ï¿½Æ¤ï¿½ï¿½Ã¤ÆºÇ¸ï¿½Ë¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½Åªï¿½Î¥Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½Ì¾ï¿½Ë¥ï¿½Í¡ï¿½ï¿½à¤¹ï¿½ë¡¢ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¥ï¿½ï¿½Î¥ï¿½Í¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¬ï¿½ï¿½Permission Error��ȯ�����Ƥ��ޤ�����
�����������顼�θ����ˤʤäƤ���ե�����ϡ���͡���ľ���˳μ¤�close()����Ƥ��ޤ��� �ʤ�Permission Error��ȯ�����Ƥ���Τ���Ĵ�٤뤿���Process Monitor�dz����ե�����˴ؤ��륷���ƥॳ������ɤäƤߤ��Ȥ�����
- Bazaar���ե������close()���Ƥ��륿���ߥ󥰤ǡ�CloseFile()��ȯ�Ԥ���Ƥ��ʤ�
- �ʤ������顼ȯ�����plink.exe����CloseFile()����Ƥ���
�Ȥ�������Ƚ��ޤ�����
�ǽ�ϡ֤ʤ��plink.exe��Bazaar�λȤäƤ���ե�����Υϥ�ɥ����äƤ��������פȺ��𤷤Ƥ����ΤǤ�����Bazaar��IRC�Ǥ��λ����ä��Ƥߤ��Ȥ����� "<jelmer>naoki: It's inheriting handles from the parent process perhaps?" �ȸ���졢Windows�Υץ������ȥե�����ϥ�ɥ�ˤĤ���Ĵ�٤Ƥߤޤ�����
�ޤ���Windows��CreateProcess()�����ƥॳ����ϡ�bInheritHandles�Ȥ�����������äƤ��ơ����ΰ�����TRUE�ξ��ϥ�ɥ��ҥץ������˰����Ѥ��ޤ��� �����Ѥ��ʤ��ȥѥ��פ����ѤǤ��ʤ��Τǡ�libsvn��bInheritHandles=TRUE��ssh���饤����Ȥ�Ω���夲�ޤ���
CreateProcess()¦�ǥѥ��װʳ��Υϥ�ɥ������Ѥ��ʤ��褦�ʻ����Ǥ��ʤ��ΤǤ����� CreateFile()��lpSecurityAttributes������SECURITY_ATTRIBUTES��¤�Τ��Ϥ����Ȥ��Ǥ����������bInheritHandle�Ȥ����ե饰������ޤ��� ���Υե饰��FALSE�ˤ���ȡ�CreateFile()�Ǻ�ä��ե�����ϥ�ɥ�ϻҥץ������˰����Ѥ���ʤ��褦�Ǥ���
Python���椫��CreateFile() API ��ľ�����Ѥ���ΤϤ���ä����ݤʤΤǡ�MSVCRT��open()��fopen()�Ǥ�Ǥ��ʤ���Ĵ�٤Ƥߤ��Ȥ�����
- fcntl.h ����������Ƥ��� O_NOINHERIT �ե饰�� open() ���Ϥ�
- fopen() �� mode �Ȥ��ơ� "rbN" �Τ褦�˸���� N ��Ĥ���
�Ȥ�����ˡ�ǥե�����ϥ�ɥ������Ѥ��ʤ��褦�˥ե�����򳫤����Ȥ�����뤳�Ȥ�Ƚ��ޤ�����
�����ޤ�Ƚ�ä��Ȥ����ǡ�Bazaar�ν����˼�꤫����ޤ���������ˤʤäƤ���ե�����ϥӥ�ȥ����open()�ؿ���ȤäƤ��ơ� ���δؿ���mode�����Ϥ��Τޤ�fopen()��mode�����ˤʤ�Τǡ� "wb" �ȤʤäƤ���Ȥ����� "wbN" �Ƚñ¤´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¤ï¿½ï¿½ï¿½ï¿½Ê¤È»×¤Ã¤ï¿½ï¿½Î¤Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ ���Τ褦�����꤬����ޤ�����
- "N" �ϸ��ߤ�glibc�Ǥ�̵�뤵��Ƥ��뤱��ɤ⡢���貿�������Ѥ���뤫���Τ�ʤ�����¾��libc�����Ѥ���Ƥ��뤫���Τ�ʤ��� �ʤΤ�Windows�ǤΤ�"N"��Ȥ��褦�˽������ʤ��Ȥ����ʤ���
- �����⡢"N"��Í���ʤΤ�VC++2005�ʹߤ�MSVCRT�ǡ�����������MSVCRT�Ǥ�̵�뤵��롣Windows�Ǥ�Python2.4��Python2.5�ǤϻȤ��ʤ���
�ʤΤǡ�C�����open()�ؿ�����������Python��os.open()�ؿ��ȡ�os.O_NOINHERIT�ե饰�����Ѥ��ƥӥ�ȥ����open()������ˤʤ�ؿ�����������ե�����򥯥�����������ˤ��Υե�����������͡��ह����Ǥ��δؿ���Ȥ��褦�ˤ��ޤ�����
���ͤˡ�����ν����Τ�����open()�����ؤˤʤäƤ���open_file()�ؿ��������ʬ�����Ǻܤ��Ƥ����ޤ��� �ºݤν��������ν����Υޡ����ꥯ������ �Ǹ��뤳�Ȥ�����ޤ����ޤ���Pythonɸ��饤�֥���tempfile�⥸�塼���os.O_NOINHERIT�����Ѥ��ơ�����ե���������Ѥ�����˥ե���������Ǥ���褦�ˤ��Ƥ���Τǡ�������⻲�ͤˤ��Ʋ�������
O_NOINHERIT = getattr(os, 'O_NOINHERIT', 0) if sys.platform == 'win32': def open_file(filename, mode='r', bufsize=-1): """This function works like builtin ``open``. But use O_NOINHERIT flag so file handle is not inherited to child process. So deleting or renaming closed file that opened with this function is not blocked by child process. """ writing = 'w' in mode appending = 'a' in mode updating = '+' in mode binary = 'b' in mode flags = O_NOINHERIT # see http://msdn.microsoft.com/en-us/library/yeby3zcb%28VS.71%29.aspx # for flags for each modes. if binary: flags |= O_BINARY else: flags |= O_TEXT if writing: if updating: flags |= os.O_RDWR else: flags |= os.O_WRONLY flags |= os.O_CREAT | os.O_TRUNC elif appending: if updating: flags |= os.O_RDWR else: flags |= os.O_WRONLY flags |= os.O_CREAT | os.O_APPEND else: #reading if updating: flags |= os.O_RDWR else: flags |= os.O_RDONLY return os.fdopen(os.open(filename, flags), mode, bufsize) else: open_file = open
���ν���������ʤ������ޤ��С�Bazaar 2.1.1����� svn+ssh:// ����� bzr branch ���Ǥ���褦�ˤʤ�ޤ���
Bazaar 2.1 ����꡼������ޤ���
Bazaar 2.1 ����꡼������ޤ������ޤ������������ɤΤߤǤ����������������������ɤǤ��ޤ���
Bazaar�� 2.0���Υ�꡼�� ����Ubuntu�Τ褦��Ⱦǯ���ȤΥ�꡼���������塼��˰ܹԤ��Ƥ��ơ��ۤܥ������塼���̤�Υ�꡼���Ȥʤ�ޤ�����
����⡢��δ��Ǥ���Ⱦǯ�֤�Bazaar�䤽�μ��դβ��ɤ�Ҳ𤷤Ƥ����ޤ���
Bazaar���Τβ���
�ޤ���bzr���Τβ������Ǥ���
- bzr+ssh �Ǥ� bzr+sftp �Τ褦�ˡ� ~ �ǥۡ���ǥ��쥯�ȥ�����Ǥ���褦�ˤʤ�ޤ����� ��ʬ�Υۡ���ǥ��쥯�ȥ�ʲ��˥�ݥ��ȥ��֤������äƤ���ͤϡ� bzr+ssh://host/~/bzr/proj/branch ���Ѥ�û��URL�����ѤǤ���褦�ˤʤ�ޤ���
- ��������̤�®�٤����夷�ޤ������ä˥��ץ�Ȥ���Python�η��̤ʥǡ�����¤�ò¤µ¤ï¿½Ë·ï¿½ï¿½Ì¤Ë¤ï¿½ï¿½ï¿½StaticTuple��¸�ߤ��ç¤ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½Python��Ȥ��ͤϤ��һ��ͤˤ��ƤߤƤ���������
- update���ޥ�ɤ�-r���ץ���󤬤Ĥ��ޤ���������� svn �� update -r ���ץ�����Ʊ���ǡ����ߤκ�ȥǥ��쥯�ȥ�����Ƥ���Ū�˲��Υ�ӥ����� ��ñ¤¤ï¿½ï¿½ë¥³ï¿½Þ¥ï¿½É¤Ç¤ï¿½ï¿½ï¿½ï¿½Ó¥ï¿½É¼ï¿½ç¤¬Ê£ï¿½ï¿½ï¿½Ê¥×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î²ï¿½ï¿½ï¿½Æ°ï¿½ï¿½ï¿½ï¿½Ç§ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½Ê¤É¡ï¿½ï¿½ï¿½ï¿½ß¤Îºï¿½È¥Ç¥ï¿½ï¿½ì¥¯ï¿½È¥ï¿½ï¿½È¤ï¿½ï¿½ó¤·¤Æ²ï¿½ï¿½Î¥ï¿½Ó¥ï¿½ï¿½ï¿½ï¿½ï¿½Ó¥ï¿½ï¿½ ���������̤������Ǥ����ǿ���ӥ����������� -r ���ץ����̵���� bzr update ���ޤ���
GUI���
TortoiseBZR
�䤬���ƥʤò¤·¤Æ¤ï¿½ï¿½ï¿½TortoiseBZR�⡢����Ⱦǯ�֤��ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½- �ӥ�ɤ���Τ�Microsoft Visual Studio Standard�ʾ夬���פˤʤ�ޤ�����
���ޤǤϥ������ĥ�κ�����ATL��ȤäƤ����ΤǤ������⤦�����Ǥ�Visual Studio 2010 �Ǥ�̵����Express Edition��ATL����°���ʤ����Ȥ�Ƚ�����ơ�ATL��Ŧ�м�Ѥ򤷤ޤ����� ���ߤ� Windows SDK �� Python �����ǥӥ�ɤ���ǽ�Ǥ����Ȥ������Ȥǡ����˥��ƥʤ��Ƥ����ͤ��罸��Ǥ�(��) - ���ơ�������������Υ����С��쥤ɽ���ǡ��ޤ����ơ�������������Ƥ��ʤ��ե�����ˤ� ? �η��򤷤����������ɽ�����Ƥ���ΤǤ����� ���ơ�����������λ���F5�����ʤɤǼ�ư�������ʤ��Ƥ⼫ư�ǥ������󤬹��������褦�ˤʤ�ޤ�����
- i18n�б��򤷤ޤ�����TortoiseBZR�ʳ���GUI�ġ�������ܸ쥳�ߥ�˥ƥ��γ�����ζ��Ϥǹ⤤����Ψ��ݻ����Ƥ���Τǡ��Ѹ쥢��륮���ʿͤˤ�¿����Ƥ��Ȥ����������ޤ���
- ����ƥ����ȥ�˥塼�����Ƥ��������ޤ������äˡ�Bazaar�ο侩GUI�Ǥ��� bzr-explorer �䡢Ǥ�դΥ��ޥ�ɤ�¹ԤǤ��� qrun �򥳥�ƥ����ȥ�˥塼����¹Ԥ��뤳�Ȥ���ǽ�ˤʤ�ޤ�����
- �ե�������ѹ���ƻ뤷�Ƥ���ǥ��쥯�ȥ�������̤Υե�������ѹ���ȯ���������ʥץ������Υӥ����ʤɡˤ�CPU����Ψ���㴳���ˤʤäƤ����Τ������ޤ�����
qbzr��bzr-explorer
����Ū�˴����٤��⤯�ʤäƤ��ޤ����äˡ� bzr-explorer ������ 1.0rc1 ���꡼�����ޤ����� 0.x �Ϥ��� 1.x �Ϥ��ѹ������Τϡ���ȯ�ԤΡ֤�����������Ū�ʺ�ȤϤ���GUI�Ǵ���Ǥ���������פȤ���������ɽ����Ȼפ��ޤ���
- qdiff �ʤɤǥƥ����ȥե������ɽ������ݡ��ƥ����ȤΥ��󥳡��ǥ��󥰤�GUI�������Ǥ���褦�ˤʤ�ޤ�����
- qbrowse �� qcommit �ʤɤΥĥ꡼ɽ���ǡ��ե�����Υ�͡�����ư���Ǥ���褦�ˤʤ�ޤ�����
- bzr-explorer �κ�ȥĥ꡼�֥饦���ǥե�����򳫤��Ȥ��ˡ���ĥ����˥ե�����򳫤��Τ˻Ȥ����ץꥱ�����������Ǥ���褦�ˤʤ�ޤ�����
Bazaar 2.2 �˸�����
2.1 �� 2.0 �Υ֥�å��奢�åפΤ褦�ʥ�꡼���Ǥ���������Ϥޤ��桼�������Ȥ��䤹���ʤ�褦�ʲ��ɤ��ɤ�ɤ����äƤ���Ȼפ��ޤ���
��� bzr ���ΤΥإ�פʤɤ� i18n �б���ô�����褦���ȻפäƤ��ޤ���
¾�ˤ⡢git��hg�Τ褦�ˡֺ�ȥĥ꡼�ȥ�ݥ��ȥ�ϰ�Ĥǡ�������Ǥ�������Υ֥����򰷤��פȤ������������¸����� colocated branch �⡢������Ȥʤ뿷�����ץ饰���� bzr-colo �Ȥ���̾���ǥ�꡼�����졢��ȯ�ʵ���������Ƥ��ޤ���
�ޤ����Ƕ� bzr-git ���Ƥߤ��ΤǤ���������ܥ�å���󥯤����ä�git��ݥ��ȥ�򤦤ޤ������ʤ����Ȥ˵��Ť��ƽ��������ʳ�������ʤ��ʤäƤ��ޤ����� �⤦�������� 1.0 �Υ�꡼�����ᤤ�ΤǤϤʤ����Ȼפ��ޤ��� bzr-2.2 ����꡼�����줿�� ��github �Υ��饤����ȤȤ���TortoiseBZR ��Ȥ��פʤ�Ƶ�����񤯤Ĥ��Ǥ���
���ߡ����ܤ�Bazaar��Ȥ��Τ˰���Â��Ƥ��ʤ��Τ����ܸ�ξ�����Ȼפ��Τǡ����ܸ�ξ���ò½¸¤ï¿½ï¿½Hub�����Ȥ������Ȼפ��ޤ��� �轵��ҤΥǡ������󥿡��ˤ�����������С������ڤ�ơ��������֤�Ȥäƥ��åȥ��å���ʤΤǡ��⤦���Ф餯���Ԥ���������
Bazaar 2.0 ����꡼������ޤ���
���� Bazaar�ξҲ� �ǾҲ𤷤��Ȥ��ˤ� 1.9 ���ä�Bazaar�Ǥ��������θ�����Υ�꡼���򤫤��ͤ��轵�Ȥ��Ȥ� �᥸�㡼�С�����󥢥åפȤʤ� 2.0 ����꡼������ޤ�����(����������ɥ�����)
�����ʥ�꡼���Ρ��Ȥϸ���Web�����Ȥ򻲾Ȥ��Ƥ�餦�Ȥ��ơ����ΰ�ǯ��Dz��ɤ��줿�����δ��ǾҲ𤷤����Ȼפ��ޤ���
TortoiseBZR��(���֤�)���ѥ�٥�ˤʤä�
��Ϥ����Ƥ����ޥ�ɥ饤�󤫤����Ѥ��Ƥ���Τǡ������Ҳ𤷤��Ȥ���TortoiseBZR�򤢤ޤ�Ȥ�����Ǥ��ޤ���Ǥ�����
���θ塢TortoiseBZR��Ȥ�����Ǥߤ��Ȥ�����push���Ǥ��ʤ���add��Ǥ��ʤ��ʤɺ���¤ε�ǽ�������äƤ��ʤ��ä��ꡢ���ơ�������ɽ�����Ť��ƥ��ȥ쥹�ˤʤä��ꤷ���ΤǷ�ɥ��󥤥󥹥ȡ��뤷�Ƥ��ޤ��ޤ�����
���θ庣ǯ�����äƤ���TortoiseBZR�γ�ȯ�����ڤ��Ƥ��ޤ������Τޤޤ��㤤���ʤ��Ȼפä�6���Ⱦ����TortoiseBZR�γ�ȯ�˻��ä��ޤ���������2����ǰʲ��Τ褦��������褷�ޤ�����
- �������ĥ����̿Ū�ʥХ�(�ֿ������ե����������פʤɤΥܥ���ư��ʤ��ʤ롢Windows Vista�ǥ���ƥ����ȥ�˥塼�Υ쥤�����Ȥ������ʤ�)����������ޤ�����
- ���ơ������μ�����®���ʤ�ޤ������ޤ����ޤ����ơ�������������Ƥ��ʤ��ե�����ξ�� '?' �ޡ����Υ��ơ��������������ɽ�����ƥХå����饦��ɤǥ��ơ�������������뤳�Ȥǡ��������ץ�����α���®�٤��㲼���ޤ��ޤ�����(������ˡ��TortoiseHG�γ�ȯ�Ԥ�Twitter�Ƕ����Ƥ��äƳ�ȯ���ޤ��������մ���)
- add, push, send �Ȥ��ä���ǽ�򥳥�ƥ����ȥ�˥塼���ɲä��ޤ�����
�ޤ�TortoiseSVN�δ����٤ˤ���ã���Ƥ��ޤ��󤬡��Ȥꤢ�����桼���������򤹤��ư��̵���ʤäƴ���Ū��������Ⱦ������ƥ����ȥ�˥塼����ƤӽФ���褦�ˤʤä��Τǡ��ͤ˻�ƤߤƤȸ�������֤ˤʤäƤ��ޤ���
��������ݥ��ȥ�ե����ޥåȤ�ɸ��ˤʤä�
Bazaar 2.0 ����� 2a �Ȥ����뿷�餷����ݥ��ȥ�ե����ޥåȤ�ɸ��ˤʤ�ޤ����� Bazaar�Ǥϥǡ����γ�Ǽ�������Ѥ��ʳ��ˤ⡢����ǽ�Τ���˿������᥿�ǡ������ɲä������ˤ�Ť��С�������Bazaar���餽�Υ᥿�ǡ������ʤ���ӥ����򥳥ߥåȤ���Ƥ��ޤ�ʤ��褦�ˤȥ�ݥ��ȥ�ե����ޥåȤ��ѹ����Ƥ��ޤ������η�̤Ȥ���Bazaar�ˤ����̤Υ�ݥ��ȥ�ե����ޥåȤ��Ǥ��Ƥ��ޤ����֡����Υե����ޥåȤǤϢ����ε�ǽ���Ȥ��ʤ��פȤ��ä����꤬ȯ�����Ƥ��ޤ�����
�������ե����ޥåȤ�ɸ��ˤʤ뤳�Ȥǡ���ݥ��ȥ�ե����ޥåȤ򥪥ץ���󤫤����Фʤ��Ƥ⿷������ǽ�������Ȥ��롢��ݥ��ȥꥵ�������������ʤä��ꤤ���Ĥ�����®���ʤäƤ����ꤹ��Ȥ�������������ޤ���
Windows�Ǥ�Unicode�ե�����̾�ؤ��б������ɤ��줿
Python�Ǥ�Unicode API�����Ѥ��뤳�Ȥǡ�Unicode�ե�����̾�ǥե�����򰷤����Ȥ��Ǥ���ΤǤ����� sys.argv �Ǽ��륳�ޥ�ɥ饤���������Unicode�Ǥ���(Python3�Ǥ�Unicode�ˤʤ�ޤ�) Bazaar�� sys.argv �����Ѥ��Ƥ������ᡢ���ä���Unicode�ǥե�����̾�򰷤��Τ˥��ޥ�ɥ饤���������ϥ����ɥڡ����Ǥ����ե�����̾������Ǥ��ʤ��Ȥ������꤬����ޤ�����
�Ƕ�ΥС������ǤϤ�����ʬ�� GetCommandlineW() API�����Ѥ���褦�ˤʤꡢbzr���Τ����Ǥʤ�QBzr����GUI��ޤ��Unicode�ؤ��б����ʤ�Ǥ���Τǡ�Unicode�ե�����̾�˴ؤ�������ϤۤȤ�ɤʤ��ʤ�ޤ�����
���ܸ�桼�������롼�פ��Ǥ���
���ܸ�ǵ������Ǥ���Ķ����ߤ����Ȼפ���Bazaar 2.0 �Υ�꡼���ò¤¤Ã¤ï¿½ï¿½ï¿½ï¿½Ë¥æ¡¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ë¡¼ï¿½×¤ï¿½ï¿½ë¤³ï¿½È¤Ë¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ http://groups.google.co.jp/group/bazaar-ja
Launchpad��˥ɥ�����������ץ��������Ȥ����������ä���Ǥ���������ȤⳫ�Ϥ��Ƥ��ޤ���TortoiseBZR�ΥХ�������˾�ʤ󤫤⡢�Ѹ��Launchpad����Ͽ��������ڤˤǤ���Ϥ��Ǥ���Bazaar�˴ؿ��Τ������Ϥ��һ��ä��ƤߤƤ���������
MessagePack��Python Binding���꡼�����ޤ���
MessagePack �Ȥϡ��Ŷ�(id:viver)���󤬳�ȯ���줿��®�����Ψ�ʥХ��ʥꥷ�ꥢ�饤���ե����ޥåȤǤ����ܤ����� �Ŷ���������� ���ץ��������ȥ����� �򸫤Ƥ���������
Python����MessagePack�ե����ޥåȤ�Serialize/Deserialize���뤿���Python�ѥå��������ä��Τǡ�������ˡ�ȻȤ����ˤĤ��ƴ�ñ�˾Ҳ𤷤ޤ���
1. ���󥹥ȡ���
msgpack�Ȥ���̾����Python Package Index (PyPI)����Ͽ���Ƥ���ޤ��� <http://pypi.python.org/pypi/msgpack/>
setuptools�򥤥󥹥ȡ��뤷�Ƥ���Ķ��Ǥϡ�
$ easy_install msgpack
�ǥ��󥹥ȡ��뤹�뤳�Ȥ��Ǥ��ޤ���
Windows�ǥ��󥹥ȡ��뤹����ϡ�PyPI�Υѥå����������� ���饤�󥹥ȡ�������������ɤ��ƥ��󥹥ȡ��뤹��Τ�����ڤǤ���
2. ���ꥢ�饤��
�ޤ���msgpack�ѥå�������import���ޤ���
>>> import msgpack >>> help(msgpack) # docstring ���ɤ�
��ĤΥ��֥������Ȥ򥷥ꥢ�饤������ˤϡ� msgpack.packb() �����Ѥ���Τ���ñ�Ǥ���
>>> msgpack.packb([1,2,3]) '\x93\x01\x02\x03'
Ϣ³���ƥ��ꥢ�饤�������硢 msgpack.Packer ���֥������Ȥ����Ѥ���ȥ����С��إåɤ����ʤ��ʤ�ޤ���
>>> packer = msgpack.Packer() >>> packer.pack([1,2,3]) '\x93\x01\x02\x03' >>> packer.pack([4,5,6]) '\x93\x04\x05\x06'
3. �ǥ��ꥢ�饤��
msgpack.unpackb() �����Ѥ���ȡ������֥�������ʬ�Υ��ꥢ�饤�����줿�ǡ�����ǥ��ꥢ�饤���Ǥ��ޤ���
>>> msgpack.unpackb(b'\x93\x01\x02\x03') [1, 2, 3]
���ȥ꡼�फ��ǥ��ꥢ�饤�������硢 msgpack.Unpacker ���֥������Ȥ����Ѥ��뤳�Ȥǡ�Ϣ³�����ǥ��ꥢ�饤�����Ǥ����ꡢ���֥������Ȥζ�����Ƚ��ʤ������б��Ǥ��ޤ���
>>> unpacker = msgpack.Unpacker() >>> buf = b'\x93\x01\x02\x03' * 5 >>> len(buf) 20 >>> unpacker.feed(buf[:9]) >>> for o in unpacker: ... print o ... [1, 2, 3] [1, 2, 3] >>> unpacker.feed(buf[9:]) >>> for o in unpacker: ... print o ... [1, 2, 3] [1, 2, 3] [1, 2, 3]
4. �٥���ޡ���
�ƥ��ȥ�����:
#!/usr/bin/env python # coding: utf-8 from msgpack import packs, unpacks from cPickle import dumps, loads import simplejson as json from time import time BENCH_NUM = 10 def bench(func, num=BENCH_NUM): start = time() for i in xrange(BENCH_NUM): func() end = time() print "%-12s %4.3f[ms]" % (func.__name__, (end-start)*1000/BENCH_NUM) def setup_int(): global a, a_pickle, a_mpack, a_json a = range(1024) * 2**10 a_pickle = dumps(a) a_json = json.dumps(a) a_mpack = packs(a) def setup_str(): global a, a_pickle, a_mpack, a_json a = ['a'*(i % 4096) for i in xrange(2**14)] a_pickle = dumps(a) a_json = json.dumps(a) a_mpack = packs(a) def pickle_dump(): dumps(a) def pickle_load(): loads(a_pickle) def json_dump(): json.dumps(a) def json_load(): json.loads(a_json) def mpack_pack(): packs(a) def mpack_unpack(): unpacks(a_mpack) targets = [ pickle_dump, pickle_load, json_dump, json_load, mpack_pack, mpack_unpack] import gc gc.disable() bytes_suffix = "[bytes]" print "== Integer ==" setup_int() print "= Size =" print "pickle:", len(a_pickle), bytes_suffix print "json: ", len(a_json), bytes_suffix print "mpack: ", len(a_mpack), bytes_suffix for t in targets: bench(t) print "== String ==" setup_str() print "= Size =" print "pickle:", len(a_pickle), bytes_suffix print "json: ", len(a_json), bytes_suffix print "mpack: ", len(a_mpack), bytes_suffix for t in targets: bench(t)
���:
== Integer == = Size = pickle: 6203398 [bytes] json: 5154816 [bytes] mpack: 2752517 [bytes] pickle_dump 248.640[ms] pickle_load 360.288[ms] json_dump 255.601[ms] json_load 136.922[ms] mpack_pack 51.383[ms] mpack_unpack 26.851[ms] == String == = Size = pickle: 33731696 [bytes] json: 33611776 [bytes] mpack: 33595139 [bytes] pickle_dump 182.324[ms] pickle_load 141.639[ms] json_dump 126.675[ms] json_load 93.945[ms] mpack_pack 66.833[ms] mpack_unpack 34.953[ms]
pickle��json���ݤ��Ƥ��ޤ������ޤ��ޤ�������;�Ϥ����ꤽ���Ǥ��� �Ȥ���pack��unpack�Ȱ�ä����̤�Python���֥������Ȥ���������ɬ�פ�����櫓�ǤϤʤ��Τˡ�unpack������֤������äƤ��ޤäƤ��ޤ���
5. ����¾
�����ǤϾҲ𤷤Ƥ��ʤ���simplejson��pickle�⥸�塼��˻�����API�⤢��ޤ���pickle��json����msgpack�ذܹԤ���Ȥ��ϥѥå����������õ���ƤߤƲ�������
�����������ߤ�msgpack�ϥХ�������������ư�����������������󥹷������񷿤ˤ����б��Ǥ��Ƥ��ޤ���simplejson�� dumps() �� defalut() �ؿ��� loads() �� object_hook() �ؿ����Ѱդ��뤳�Ȥǥ桼����������������饹�Υ��ꥢ�饤�����ǥ��ꥢ�饤�����Ǥ��ޤ���0.2 �Ǥ�Ʊ���褦�� default() ��object_hook() ���б����褦�Ȼפ��ޤ���
IPython��unicode��ƥ���Ȥ�
IPython�Ȥ�
IPython�Ȥϡ�Pythonista���������ʿ͵���ؤ륤�󥿥饯�ƥ��֥�����Ǥ���
Python�Ϥ�Ȥ�ȥ��󥿥饯�ƥ��֥��������¢���Ƥ���ΤǤ����� IPython�ˤ���¢�Υ��󥿥饯�ƥ��֥��������٤�¿��������������ޤ��������Ĥ��󤲤Ƥߤޤ���
ưŪ�䴰
�ѿ�̾�ʤɤ�����ޤ����Ϥ������֤�TAB�����򲡤��ȡ��Ĥ���䴰���Ƥ���ޤ��� ���䤬ʣ��������ϸ��������ɽ�����Ƥ���ޤ���
���󥿥å����ϥ��饤��
�ץ���ץȤʤɤ˿����Ĥ��ޤ�������äȤ��줷���Ǥ���
�̾�Υ�����Ȥ��Ƥ����Ѳ�ǽ
IPython����ǡ�ls�ǥե���������򸫤��ꡢcd�ǥ����ȥǥ��쥯�ȥ���ư������Ǥ��ޤ��� !vim �Τ褦�˥���������᡼�����ޡ�����³���ƥ��ޥ��̾�����Ϥ��뤳�Ȥǡ����ޥ�ɤμ¹Ԥ�Ǥ��ޤ��� ����ˡ����ޥ�ɤν��Ϥ�Python���ѿ��˳�Ǽ���졢Python�������Ѳ�ǽ�ˤʤ�ޤ���Unix�����̤Υ��ޥ�ɤ�Ȥ����ʤ��ʤ��ä��ꡢWindows�ǥ��ޥ�ɤ����ʤ����Ȥ��������ä��ꤹ��Ȥ��˽������ޤ���
�褯�Ȥ���ǽ���ά���ǵ��Ҳ�ǽ
help(o) ������� o? �Ǥ��Υ��֥������ȤΥɥ�����Ȥ��ɤ�ޤ���
func(a, b) ������� func a b �Ǵؿ��ƤӽФ�����ǽ�Ǥ���
���ǥ�����Ϣ�Ȳ�ǽ
ed foo.py
�Τ褦�ˤ��뤳�Ȥǡ�foo.py
�������ǥ����dz������Խ��Ǥ��ޤ��� �����ƥ��ǥ������Ĥ���ȡ���ưŪ�ˤ��Υե����뤬eval����ޤ��� ���ε�ǽ��Ȥ��ȡ����ǥ����Ǵؿ���񤯢�IPython���ư����ǧ���뢪���ǥ����Ǵؿ��������롢�Ȥ�����������ǥ���������ȯ�Ǥ��ޤ��� ��������Ƥ��ޤ��ȡ�IDE���ߤ����Ȼפ�ʤ��ʤ�ޤ���
IPython��Unicode��ƥ���Ȥ�
IPython 0.9.1 ��Unicode��ƥ���Ȥ����Ȥ���ȡ����Τ褦�����꤬����ޤ���
$ python Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> u"��" u'\u3042' >>> $ ipython Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49) Type "copyright", "credits" or "license" for more information. IPython 0.9.1 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object'. ?object also works, ?? prints more. In [1]: u"��" Out[1]: u'\xe3\x81\x82'
���󥽡����UTF-8�ʤΤ�"��" ��3byte�ˤʤäƤ���ΤǤ��������줾���byte���ʸ����ǧ������Unicodeʸ�����Ѵ�����Ƥ��ޤ���
����������ɤäƤߤ��Ȥ�����IPython��Python���Ȥ߹��ߴؿ� compile()
��ƤӽФ��Ȥ��ˡ�ʸ����򥨥󥳡��ɤ��Ƥ��ޤäƤ���Τ˵��Ť��ޤ�����
compile()
��ư���Ĵ�٤Ƹ����Ȥ���
>>> c = compile("""u'��'""", "foo.py", 'single') >>> c.co_consts (u'\xe3\x81\x82', None) >>> c = compile(u"""u'��'""", "foo.py", "single") >>> c.co_consts (u'\u3042', None)
�ӥ󥴤Ǥ���
�Ȥ������Ȥǡ�IPython/iplib.py
�˼��ν����򤹤뤳�Ȥǡ�IPython��Unicode��ƥ�뤬�������褯�Ȥ���褦�ˤʤ�ޤ�
--- iplib.py.old 2009-03-13 15:42:33.000000000 +0900 +++ iplib.py 2009-03-13 15:42:58.000000000 +0900 @@ -2019,9 +2019,9 @@ # this allows execution of indented pasted code. It is tempting # to add '\n' at the end of source to run commands like ' a=1' # directly, but this fails for more complicated scenarios - source=source.encode(self.stdin_encoding) - if source[:1] in [' ', '\t']: - source = 'if 1:\n%s' % source + #source=source.encode(self.stdin_encoding) + if source[:1] in [u' ', u'\t']: + source = u'if 1:\n%s' % source try: code = self.compile(source,filename,symbol)
Windows (Python 2.6.1, IPython 0.9.1) �Ǥ⤦�ޤ�ư������ǧ���Ƹ��ޤ���
In [1]: u"��" Out[1]: u'\u3042' In [2]: u"��" Out[2]: u'\u30bd'
�Хå���Ǥ�