2025�N12���ɓ˔@�Ƃ��āuWindows�ł�Python 3.15��15���̍������v�Ƃ����b�肪�o�ăr�b�N���A�����Ċ��������������ł��傤�B���̔��Βn�_�ł���Ken Jin���̃u���O�L������ɍ������ł��闝�R�������������Ă݂܂����B
�@����A�wPython 3.15's interpreter for Windows x86-64 should hopefully be 15% faster�x�Ƃ����u���O�L�������J����Ă��܂����B����́uWindows�p��Python�C���^�v���^�[��15�����炢����������i�\�肾�j��v�Ƃ������e�̋L���ł��B�wHP���킳���̌����m�[�g�x�̑�1�e�ł́A������Ƃǂ��������ƁH�@���ď��������[�@�肵�Ă݂邱�Ƃɂ��܂��傤�B
�@�ǂ���HP���킳���ł��B
�@�����܂��Ă��߂łƂ��������܂��B�z���g�͂��̋L���A�U�b�N���Ƃ��Љ�邾���̂��肾�����̂ł����A�~�x�݂̎��R�����݂����Ȃ��Ă��܂����̂ŁA�����m�[�g�ŏЉ�邱�Ƃɂ��܂����B�Ƃ����Ă��AWindows��Visual Studio�i!=Visual Studio Code�j��p�ӂ��Ď��ۂɃr���h���Ă݂悤�A�Ȃ�Ă��Ƃ͂��Ă��܂���B
�@�����ł̓u���O�L���̓��e��⑫���Ȃ���A�u�ց[�v�Ǝv���Ă���������Ώ\���ł��B
�@�ҏW���ł��u���O�͂������߂��Ă���v�u�����܂ł���ł������Ǝv���܂��v�Ȃǂ̐�������̂ł����A���C�ɂȂ����������ł����B���߂�Ȃ����B
�@���̋L���wPython 3.15's interpreter for Windows x86-64 should hopefully be 15% faster�x�́APython�̃R�A�`�[���̃����o�[�ł���Ken Jin���ɂ����̂ł��B�����āA�����2025�N3���ɓ��������J�����wI'm Sorry for Python's tail-calling Interpreter's Results�x�����L���ɂȂ��Ă��܂��B
�@2025�N3���̋L���ɂ́A���̂悤�Ȃ��Ƃ�������Ă��܂����B
�@�Ȃ��A�wWhat's new in Python 3.14�x�ɂ��Δ�r�Ώۂ�x86-64��AArch64�A�[�L�e�N�`�����Clang 19��p���ăr���h���ꂽPython 3.14�ŁA�����Ăяo����@���g���Ă��Ȃ����̂������ł��B
�@�����āA����̋L���ł͂��̎Ӎ߂�2�̃v���b�g�t�H�[���Ɋւ��ēP��ł��邱�ƂɂȂ��������ł��B
�@�u�M�҂ɂ��ԈႢ�͂���̂ŁA���߂ɂ��̂��Ƃ\���āA�����̐l�Ɍ����Ă��炤���ƂŁA�o�O����������������ˁv�Ƃ������R��2025�N12���ɂ��̂��Ƃ��u���O�L���Ƃ��Ĕ��\���ꂽ�Ƃ����킯�ł��B
�@���̃L�[�|�C���g�ƂȂ�̂��ȉ��̗v�f�ł��B
�@���Ɍ�҂�Windows�ŁiX86-64�j��Python�C���^�v���^�[�̑��x����Ɍ������Ȃ��v�f�ƂȂ��Ă��܂��i����AClang���g���ăr���h����̂ł���A���l��__attribute__((musttail))�Ƃ����������T�|�[�g����Ă��܂��j�B�����ɂ��Ă͌�ŐG��܂��B
�@���ꂩ�疖���Ăяo����@���̗p�������Ƃœ���ꂽ����1�̑傫�ȃ����b�g�ɂ��Ă��u���O�L���ł͐G����Ă��܂��B����ɂ��Ă��Ō�ŐG��܂��傤�B
�@�ł��A���̑O�ɏ]����switch-case�ɂ��C���X�g���N�V�����̏������猩�Ă݂܂��傤�B
�@switch-case��Python�̃o�C�g�R�[�h����������Ƃ����͎̂��̂悤�ȃR�[�h�����s����Ƃ������Ƃł��i�R�[�h�̑̍ق�HP���킳�����K���ɒ������Ă��܂��j�B
dispatch_opcode:
switch (dispatch_code)
{
/* BEGIN INSTRUCTIONS */
case BINARY_OP: // TARGET�}�N����W�J���case�߂ƃ��x���ɂȂ�
{
// ...
// BINARY_OP�C���X�g���N�V��������������R�[�h
// ...
// ���̃o�C�g�R�[�h�̏���
{
NEXTOPARG(); // opcode�Ȃǂ��擾����i���e�͏ȗ��j
PRE_DISPATCH_GOTO(); // �ȗ�
dispatch_code = opcode | tracing_mode;
goto dispatch_opcode;
}
}
case BINARY_OP_ADD_FLOAT:
{
// ...
// BINARY_OP_ADD_FLOAT�C���X�g���N�V��������������R�[�h
// ...
// ���̃o�C�g�R�[�h�̏���
{
NEXTOPARG(); // opcode�Ȃǂ��擾����i���e�͏ȗ��j
PRE_DISPATCH_GOTO(); // �ȗ�
dispatch_code = opcode | tracing_mode;
goto dispatch_opcode;
}
}
// ����Ȋ����̃R�[�h����������
/* END INSTRUCTIONS */
}
Py_UNREACHABLE();
�@swich���̑O�Ɂudispatch_opcode:�v�Ƃ������x��������܂��B�����āA�ecase�߂̍Ō�ł́ugoto dispatch_opcode;�v�Ƃ���switch���̐擪�ɃW�����v���Ă��܂��i���̂Ƃ��A���ɏ�������C���X�g���N�V�������擾����̂�NEXTOPARG�}�N���̖����ɂȂ��Ă��܂��B����͎��ɏЉ�閖���Ăяo����@�̃R�[�h�ł������ł��j�B
�@��̃R�[�h�͏Љ�Ă���ȊO�̃��x���⏈�����ȗ����āA���Ȃ�ȒP�Ȃ��̂ɂ��Ă���̂ŁA���ۂ̃R�[�h�Ƃ͈قȂ�_�ɂ͒��ӂ��Ă��������B���ۂ̂Ƃ���A���̃R�[�h��Python�̃o�C�g�R�[�h�ꗗ�ibytecodes.c�j���玩���I�ɐ��������generated_cases.c.h�Ƃ����t�@�C������ɁA���낢��ȃ}�N����W�J������ŁAHP���킳�����K�X�����������̂ł��B
�@�ŁA���̃R�[�h�A����2026�N1��6���̎��_��1��2000�s�ȏ゠��܂��B1��2000�s��switch���ł���B�Ȃ�ς����ł���ˁB
�@����A����generated_cases.c.h�t�@�C�����Ăяo���p�Ƀ}�N���W�J����Ǝ��̂悤�ȃR�[�h�ɂȂ�܂��i������̍ق�HP���킳�����K���ɒ������Ă��܂��j�B
/* BEGIN INSTRUCTIONS */
Py_NO_INLINE PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP(
_PyInterpreterFrame *frame, _PyStackRef *stack_pointer,
// �c�c�ȗ��c�c
int oparg)
{
// ...
// BINARY_OP�C���X�g���N�V��������������R�[�h
// ...
NEXTOPARG(); // opcode�Ȃǂ��擾����
PRE_DISPATCH_GOTO(); // �ȗ�
Py_MUSTTAIL return
(((py_tail_call_funcptr *)instruction_funcptr_table)[opcode])(
frame, stack_pointer, tstate, next_instr,
instruction_funcptr_table, oparg);
}
Py_NO_INLINE PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP_ADD_FLOAT(
_PyInterpreterFrame *frame, _PyStackRef *stack_pointer,
// �c�c�ȗ��c�c
int oparg)
{
// ...
// BINARY_OP_ADD_FLOAT�C���X�g���N�V��������������R�[�h
// ...
NEXTOPARG(); // opcode�Ȃǂ��擾����
PRE_DISPATCH_GOTO(); // �ȗ�
Py_MUSTTAIL return
(((py_tail_call_funcptr *)instruction_funcptr_table)[opcode])(
frame, stack_pointer, tstate, next_instr,
instruction_funcptr_table, oparg);
}
// ����Ȋ����̃R�[�h����������
/* END INSTRUCTIONS */
�@1��2000�s��switch����C�̊���`�ɕς���Ă���Ƃ���ɒ��ڂ��Ă��������B������������u_TAIL_CALL_�v�Ŏn�܂�Aswitch����case�߂ɂ������C���X�g���N�V����������ɑ����`�ɂȂ��Ă��܂��B�����ɂ������Ăяo����O���ɒu���������ł��ˁB�����āA���̖����́uPy_MUSTTAIL return (((py_tail_call_funcptr *)instruction_funcptr_table)[opcode])(...)�v�̂悤�ɂȂ��Ă��܂��B
�@��������ƃ\�[�X��ǂ���Ă��Ȃ��̂ł����Ainstruction_funcptr_table�͊e�C���X�g���N�V��������������R�[�h�̃A�h���X���܂ރe�[�u�����Ǝv���܂��B��������opcode�Ŏ�����鎟�ɏ�������C���X�g���N�V�����ɑΉ�����A�h���X���擾���āA������������������̂悤�ɌĂяo�����s���Ă���̂�������܂��B
�@�����܂łɕ����������Ƃ�switch-case�̎�@�ł�1��2000�s��switch�������s����邱�ƁB�����Ăяo���̎�@�ł́A���ꂪ����`�ɕ�������āA�e���̖����ł͎��̃C���X�g���N�V������������������Ăяo���悤�ɂȂ��Ă���Ƃ������Ƃł��B
�@�ł��A����̃o�C�g�R�[�h���������Ă����Ƃ�����A�����Ăяo�����тɃX�^�b�N�Ƀf�[�^���ς܂�Ă����킯�ŁA���̂����ɃX�^�b�N�����Ă��܂������ł��B�ł����A�����͂Ȃ�Ȃ��̂ł��B���ꂪ�����Ăяo����@�̂悢�Ƃ���B�����āA�L�[�ɂȂ�̂��uPy_MUSTTAIL�v�ł��B
�@���������悤�ɖ����Ăяo���Ƃ́A���̖����ŕʂ̊����Ăяo�����Ƃ̂悤�ɕ������܂��B�ł��A�����P�ɂ�������悢�Ƃ����킯�ł�����܂���B
�@�u�����ċA�v�Ƃ������t�͕��������Ƃ�����Ǝv���܂��B����͊����ċA�I�ɌĂяo���Ƃ��ɁA���ݎ��s���̊��̃X�^�b�N���ė��p���āA�����Ɏ��ɌĂяo�����ɕK�v�ȃf�[�^��u���A�������g���Ăяo���̂ł͂Ȃ��A�������g�̊��̃R�[�h�̐擪�ɃW�����v����Ƃ������̂ł��B�������邱�ƂŁA�X�^�b�N�ʂɎg�����ƂȂ��A�ċA�I�Ɏ������g�����s�ł��܂��B�X�^�b�N�����邱�Ƃ�����܂���iPython�ł͊��̖����ċA�̍œK�����W���ł̓T�|�[�g����Ă��Ȃ����Ƃ��������̕�������͂��ł���ˁj�B
�@�����ł����u�����Ăяo���v�͂���𑼂̊��̌Ăяo���ɂ��Ă��K�p���悤�Ƃ������̂ł��B��������A��������̃o�C�g�R�[�h�̃X�g���[�����������Ă������ŁA�X�^�b�N���ė��p���Ȃ���A�A���I�ɃC���X�g���N�V�����������ł���悤�ɂȂ�܂��B
�@�������A�����Ăяo���̍œK���ɂ͖�肪����܂��B����͂����܂ł��u�œK���v�ł��B�œK�������邩���Ȃ����̓R���p�C������ł��B�œK�����Ă���Ȃ��Ƃ��������̖����Ăяo�������ɗ����܂���i�Ƃ������A�����炭�̓o�C�g�R�[�h�̏������i��ł��������ɃX�^�b�N�����Ă��܂���������܂���j�B
�@�����ŏd�v�ɂȂ�̂�����������uPy_MUSTTAIL�v�Ȃ̂ł��B���e���M���_�ł͂��̃}�N����ceval_macros.h�t�@�C���Ŏ��̂悤�ɒ�`����Ă��܂��B
# if defined(_MSC_VER) && !defined(__clang__)
# define Py_MUSTTAIL [[msvc::musttail]]
# else
# define Py_MUSTTAIL __attribute__((musttail))
# endif
�@MSVC�ɂ�����[[msvc::musttail]]������Clang�ɂ�����__attribute__((musttail))�����͂ǂ�������̊��̖����Ăяo���i�܂�A�X�^�b�N���ė��p���āA���̊��̐擪�A�h���X�ɃW�����v���邱�Ɓj������������̂ł��B�����Ăяo���ł��Ȃ��ƁA�R���p�C�������s���܂��B
�@���̌��ʁA�����Ăяo����@�̃R�[�h�ł͎��ɌĂяo���C���X�g���N�V�����������������Ăяo���ƂȂ�܂��B
�@�u���O�L����AArch64��macOS�iXCode Clang�j��Windows�iMSVC 18�j�������A�Ӎ߂�P��ΏۂƂȂ������R�͂����ɂ���̂ł��傤�B�ł����A���̑��������̃R���p�C���ł��T�|�[�g�����悤�ɂȂ�A�����̊��Ŗ����Ăяo����@���̗p�����C���^�v���^�[���g����悤�ɂȂ�͂��ł��B
�@switch-case�ł̃C���X�g���N�V�����̏����ƁA�����Ăяo���ł̃C���X�g���N�V�����̏����̍���}�ɂ���Ǝ��̂悤�ɂȂ�ł��傤�B�Ⴆ�ALOAD_NAME��PUSH_NULL��LOAD_SMALL_INT��LOAD_SMALL_INT��CALL���c�c�̂悤�ȏ����ŃC���X�g���N�V�������������Ă����Ƃ��܂��B
�@switch-case�Ȃ�ȉ��̐}�̂悤�ɂȂ�܂��B
�@switch���ł̃C���X�g���N�V�����̏����͕�����₷���̂ł����A�S�̂�1��2000�s���鋐��ȃR�[�h�ɂȂ��Ă��܂��܂��B
�@����A�����Ăяo���ł̃C���X�g���N�V�����̏����͎��̂悤�ɂȂ�܂��B
�@������̓C���X�g���N�V������������������������݂��A����炪�����Ăяo���̌`�Łi�X�^�b�N���ӂ�̐S�z��A������s�v�ȃn�E�X�L�[�s���O�W���u�̕K�v�Ȃ��Ɂj�C���X�g���N�V�����̏������A�����Ă����܂��B
�@�u�����Ăяo���Ŋ����v�Ǝv���Ă�����A�����ł͂Ȃ��悤�ȋC������Ƃ����̂�����Љ���L���̏d�v�ȃ|�C���g�ł��B�u���O�L���́uWhere exactly do the speedups come from�H�v�ɂ́uMy main guess now is that tail calling resets compiler heuristics to sane levels, so that compilers can do their jobs.�v�Ƃ���܂��B
�@�K���������Ɓu���v���ƁA�����Ăяo����@���ƁA�R���p�C���̃q���[���X�e�B�b�N�����S�ȏ�ԂɃ��Z�b�g�����̂ŁA�R���p�C���������̎d�����ł����Ȃ����ȁv���炢�ł��傤���B�����ł����u�q���[���X�e�B�b�N�v�Ƃ�C�R�[�h�̍œK���Ɋւ��鎎�s����⌟���̂悤�ȈӖ��ł��傤�B
�@�܂�A1��2000�s��switch���̍œK���͂ł��Ȃ����ǁA���S�̊��Ȃ炻�����ʂɍœK�����邱�Ƃ͉\���Ƃ������Ƃł��B�u���O�L���̌㔼�ł͖����Ăяo���̘b�ł͂Ȃ��A�œK���̘b�Ƀt�H�[�J�X���ڂ��Ă��܂��B
�@�Ⴆ�A��قǂ��o�Ă���generated_cases.c.h�t�@�C���ɂ͎��̂悤�ȋL�q������܂��B
TARGET(BINARY_OP_ADD_INT) {
// ...
// �ȗ�
// ...
// _POP_TOP_INT
{
value = r;
assert(PyLong_CheckExact(PyStackRef_AsPyObjectBorrow(value)));
PyStackRef_CLOSE_SPECIALIZED(value, _PyLong_ExactDealloc);
}
// ...
// �ȗ�
// ...
}
�@�����switch-case��@�̃C���^�v���^�[�ł�case�߂ɁA�����Ăяo���̃C���^�v���^�[�ł͖����Ăяo����O���ɒu��������`�ւƓW�J�����}�N���ł��B�܂��A����͒u���Ă����āA����BINARY_OP_ADD_INT�C���X�g���N�V��������������R�[�h�̒��ł́APyStackRef_CLOSE_SPECIALIZED�Ƃ��������Ăяo����Ă��܂��B
�@���̊��͑傴���ςɌ����ƁA���̂悤�ɃC�����C�����\�Ȋ��Ƃ��Ē�`����Ă��܂��B
static inline void
PyStackRef_CLOSE_SPECIALIZED(_PyStackRef ref, destructor destruct)
{
// �c�c�ȗ��c�c
assert(!PyStackRef_IsNull(ref));
// �c�c�ȗ��c�c
if (PyStackRef_RefcountOnObject(ref)) {
_Py_DECREF_SPECIALIZED(obj, destruct);
}
}
�@�Ƃ��낪�Aswitch-case��@�̃C���^�v���^�[�ł͍œK�������܂������Ă��Ȃ��̂��������̂�ken jin���̃u���O�L���ɂ���ȉ��̉摜�ł��B
�@�u���O�L������HP���킳�����uPyStackRef_CLOSE_SPECIALIZED�v���������Ă���̂ŊY���ӏ������F���}�[�J�[�Ŏ�����Ă��܂����A��ԉ��ł��̊���call����Ă���̂�������܂��B
�@����A�����Ăяo����@�̃C���^�v���^�[�ł͎��̉摜�̂悤�ɁA���̊����Ăяo���ꂸ�ɃC�����C��������܂����B
�@�����switch���ł́A�R���p�C�����S�Ă�c��������ōœK����i�߂邱�Ƃ��������ǂ��A���ɕ������邱�ƂŌX�̊��ɂ����ڂ�������悢���߁A���̂悤�ȍœK���i�����ł͊��̃C�����C�����j���\�ɂȂ�A�S�̂Ƃ��Ă͂��Ȃ�̍������������߂�Ƃ����������������̂��Ǝv���܂��B�u�����Ăяo���Ƃ�����@���̗p�������ƂŁA�����switch�����ʂ̊��ւƕ����ł��A���ꂪ�R���p�C���ɂ��œK�����\�ɂ����v�Ƃ����̂��������̃L���������Ƃ����킯�ł��ˁB
�@�Ƃ����̂��A���̓~�x�݂̎��R�����̌��ʂł��BPython�ŏ����ꂽ�\�[�X�R�[�h�͂��낢��ȋL�����������ł���ǂ݂܂������AC�̃R�[�h��ǂނ̂̓z���g�ɋv���Ԃ�ł����B���ӓ_�Ƃ��ẮA��L�̍œK���̉摜������Ɓu_TAIL_CALL_�c�c�v�݂����ȂƂ��낪����܂����A����͕ʂɖ����Ăяo�������Ă���̂ł͂Ȃ��A���̋ߕӂɃW�����v���Ă��邾���̂悤�ł��B�ŏ��Ɍ����Ƃ��ɂ́A�u�����Ăяo�����Ă邶���I�v�Ǝv�������Ƃ�����܂����A�����ł͂Ȃ��A����͂����܂ł��œK���̂��b�Ȃ̂ł��ԈႦ�Ȃ��B
�@����Ȋ����ŁuHP���킳���̌����m�[�g�v���n�܂����Ⴂ�܂����B����͑O��҂̋L���ɕ����ł��邩�ȁH�@�Ǝv�����̂ł����A������Ɩ��������ŁA�����Ȃ�̂��o���1��̋L���Ƃ����Ă��炢�܂����B����́A�Ȃ�ׂ���Z�Ƀ`���`���b�Ƃ����L�������͂��������Ǝv���Ă��܂����A�����ł��Ȃ����Ƃ�����ł��傤�B�����łȂ��Ƃ��ɂ͋�����Ȃ��炨�t���������������܂��B
���S�Ҍ����A�f�[�^���́EAI�E�@�B�w�K�EPython�̕����@�@��IT��Deep Insider�Ŋw�ڂ�
Copyright© Digital Advantage Corp. All Rights Reserved.
��IT eBook