문자열 연결에 +를 사용해서는 안되며, 대신 항상 ''.join을 사용하는 것은 신화 일 수 있습니다. +
을 사용하면 불변 문자열 개체의 불필요한 임시 복사본이 만들어 지지만 실제로 다른 인용되지 않은 사실은 루프에서 join
을 호출하면 일반적으로 function call
의 오버 헤드가 추가된다는 사실입니다. 당신의 모범을 보자.
는 두 목록, 링크 된 SO 질문에서, 다른 하나는 더 큰 만들기 각
join
및
+
기능을 사용하는 두 가지 기능
UseJoin
및
UsePlus
을 만들 수 있습니다
>>> myl1 = ['A','B','C','D','E','F']
>>> myl2=[chr(random.randint(65,90)) for i in range(0,10000)]
제작.
>>> def UsePlus():
return [myl[i] + myl[i + 1] for i in range(0,len(myl), 2)]
>>> def UseJoin():
[''.join((myl[i],myl[i + 1])) for i in range(0,len(myl), 2)]
은 첫 번째 목록 그들은 거의 같은 런타임이
>>> myl=myl1
>>> t1=timeit.Timer("UsePlus()","from __main__ import UsePlus")
>>> t2=timeit.Timer("UseJoin()","from __main__ import UseJoin")
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
2.48 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
2.61 usec/pass
>>>
와 timeit을 실행할 수 있습니다.
는 사용 cprofile 명령을
>>> myl=myl2
>>> cProfile.run("UsePlus()")
5 function calls in 0.001 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.001 0.001 0.001 0.001 <pyshell#1376>:1(UsePlus)
1 0.000 0.000 0.001 0.001 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {range}
>>> cProfile.run("UseJoin()")
5005 function calls in 0.029 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.015 0.015 0.029 0.029 <pyshell#1388>:1(UseJoin)
1 0.000 0.000 0.029 0.029 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {len}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
5000 0.014 0.000 0.014 0.000 {method 'join' of 'str' objects}
1 0.000 0.000 0.000 0.000 {range}
을 수 있습니다 그리고 그것은 사용이 오버 헤드에 추가 할 수 있습니다 불필요한 함수 호출의 결과에 가입하는 것이 보인다.
이제 질문으로 돌아옵니다. 모든 경우에 join
을 초과하는 +
의 사용을 방해해야합니까? 나는 더 믿을
는 가지 질문
병합 동작 없음에 고려 문자열의
- 길이를주의해야한다.
개발 과정의 사전 성숙 최적화는 악합니다.
그 깔끔한 (풋 노트 [6] 참조) 당신은 연결하지 더 제어 할 수 있습니다. 하지만 조금 더 느린 문자열 박살 내기 : P –
'+'가 빠르거나 느린 것을 말하고 있습니까? 그리고 왜? – Taymon
는 +, 빠르다 '[2]에서 %의 timeit을 "A"* 80 + "B"* 80' '1000000 루프 3의 기기 : loop' 당 356 NS '에서 [3] : % '1000000 개의 루프, 3 개당 907 ns/루프 당 ' –