print ステートメントのバイト コードを調べると、次のようになります。
>>> def f():
... print "Worker"
...
>>> dis.dis(f)
2 0 LOAD_CONST 1 ('Worker')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
実際、多数のアイテムを印刷すると、多数の PRINT_ITEM バイトコードが生成されます。
>>> def g():
... print "Worker", "Hello"
...
>>> dis.dis(g)
2 0 LOAD_CONST 1 ('Worker')
3 PRINT_ITEM
4 LOAD_CONST 2 ('Hello')
7 PRINT_ITEM
8 PRINT_NEWLINE
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
複数の項目の間にスペースを入れるために、ファイル オブジェクトには、次の項目の前にスペースを出力する必要があるかどうかを示す softspace というフラグがあります。PRINT_ITEM と PRINT_NEWLINE のコードは、おおよそ次のようになります。
def PRINT_ITEM(f, item):
if f.softspace:
f.write(' ')
f.write(str(item))
f.softspace = True
def PRINT_NEWLINE(f):
f.write('\n')
f.softspace = False
一度に多数のスレッドから stdout に書き込むと、これらの操作はランダムにインターリーブされます。したがって、PRINT_ITEM と PRINT_NEWLINE を交互に取得する代わりに、2 つの PRINT_ITEM を連続して使用できます。その場合、2 つの PRINT_ITEM とソフトスペース フラグによって余分なスペースが生成されるため、出力に余分なスペースができます。