я ничего против генераторов не имею, но высказывание, что генераторы всегда использовать правильнее, это бред чистой воды. Генераторы нужно использовать с умом, а не пихать везде, где не попадя.
<list_iterator at 0x1074fecf8>
. То есть, запись:''.join([i for i in x if not i.startswith('x')])
i for i in x if not i.startswith('x')
''.join(i for i in x if not i.startswith('x'))
i for i in x if not i.startswith('x')
In [6]: def f(x):
...: return ''.join([i for i in x if not x.startswith('f')])
...:
In [7]: dis(f)
2 0 LOAD_CONST 1 ('')
2 LOAD_METHOD 0 (join)
4 LOAD_CLOSURE 0 (x)
6 BUILD_TUPLE 1
8 LOAD_CONST 2 (<code object <listcomp> at 0x1037a3390, file "<ipython-input-6-830e9cc6380a>", line 2>)
10 LOAD_CONST 3 ('f.<locals>.<listcomp>')
12 MAKE_FUNCTION 8
14 LOAD_DEREF 0 (x)
16 GET_ITER
18 CALL_FUNCTION 1
20 CALL_METHOD 1
22 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x1037a3390, file "<ipython-input-6-830e9cc6380a>", line 2>:
2 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 18 (to 24)
6 STORE_FAST 1 (i)
8 LOAD_DEREF 0 (x)
10 LOAD_METHOD 0 (startswith)
12 LOAD_CONST 0 ('f')
14 CALL_METHOD 1
16 POP_JUMP_IF_TRUE 4
18 LOAD_FAST 1 (i)
20 LIST_APPEND 2
22 JUMP_ABSOLUTE 4
>> 24 RETURN_VALUE
Можно было просто сказать O(logN) и не выдумывать