expity.special의 expit 함수는 벡터화 된 시그 모이 드 함수입니다. 그것은 1/(1 + e^(- x))를 계산하는데, 이것은 아마도 Taylor 시리즈와 관련되어 복잡합니다.numpy.vectorize : 왜 이렇게 느린가요?
"fast sigmoid", 1/(1 + abs (x))에 대해 알게되었는데, 훨씬 빨라야합니다. 그러나 내장 된 expit 함수는 람다 식으로 전달할 때조차도 훨씬 뛰어납니다. ~ numpy.vectorize.
from scipy.special import expit
data = np.random.rand(1000000)
(가) 내장, 복잡한 시그 모이가 빠른 :
여기를 테스트하는 하나의 방법
이%prun expit(data)
3 function calls in 0.064 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.064 0.064 0.064 0.064 <string>:1(<module>)
1 0.000 0.000 0.064 0.064 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
더 단순한 시그 모이은 약 20 배 느린 :
%prun np.vectorize(lambda x: (x/(1 + abs(x)) + 1)/2)(data)
2000023 function calls in 1.992 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1000001 1.123 0.000 1.294 0.000 <string>:1(<lambda>)
1 0.558 0.558 1.950 1.950 function_base.py:2276(_vectorize_call)
1000001 0.170 0.000 0.170 0.000 {built-in method builtins.abs}
4 0.098 0.025 0.098 0.025 {built-in method numpy.core.multiarray.array}
1 0.041 0.041 1.991 1.991 function_base.py:2190(__call__)
1 0.000 0.000 0.068 0.068 function_base.py:2284(<listcomp>)
1 0.000 0.000 1.992 1.992 {built-in method builtins.exec}
1 0.000 0.000 1.991 1.991 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 function_base.py:2220(_get_ufunc_and_otypes)
1 0.000 0.000 0.000 0.000 function_base.py:2162(__init__)
1 0.000 0.000 0.000 0.000 function_base.py:2242(<listcomp>)
2 0.000 0.000 0.000 0.000 numeric.py:414(asarray)
1 0.000 0.000 0.000 0.000 {built-in method numpy.core.umath.frompyfunc}
1 0.000 0.000 0.000 0.000 function_base.py:2266(<listcomp>)
2 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance}
1 0.000 0.000 0.000 0.000 {built-in method builtins.len}
1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
; 이것은 확실히 내 문제를 해결합니다. 고마워, 워렌! –