4. Who am I?
Kimikazu Kato
Chief Scientist at Silver Egg Technology
Algorithm designer for a recommendation system
Ph.D in computer science (Master's degree in math)
4 / 26
5. Python is Very Slow!
Code in C
#include<stdio.h>
intmain(){
inti;doubles=0;
for(i=1;i<=100000000;i++)s+=i;
printf("%.0fn",s);
}
Code in Python
s=0.
foriinxrange(1,100000001):
s+=i
prints
Both of the codes compute the sum of integers from 1 to 100,000,000.
Result of benchmark in a certain environment:
Above: 0.109 sec (compiled with -O3 option)
Below: 8.657 sec
(80+ times slower!!)
5 / 26
7. Lessons
Python is very slow when written badly
Translate C (or Java, C# etc.) code into Python is often a bad idea.
Python-friendly rewriting sometimes result in drastic performance
improvement
7 / 26
8. Basic rules for better performance
Avoid for-sentence as far as possible
Utilize libraries' capabilities instead
Forget about the cost of copying memory
Typical C programmer might care about it, but ...
8 / 26
14. Cf. In Pandas
>>>importpandasaspd
>>>importnumpyasnp
>>>df=pd.DataFrame(np.random.randn(5,3),columns=["A","B","C"])
>>>df
A B C
0 1.084117-0.626930-1.818375
1 1.717066 2.554761-0.560069
2-1.355434-0.464632 0.322603
3 0.013824 0.298082-1.405409
4 0.743068 0.292042-1.002901
[5rowsx3columns]
>>>df[df.A>0.5]
A B C
0 1.084117-0.626930-1.818375
1 1.717066 2.554761-0.560069
4 0.743068 0.292042-1.002901
[3rowsx3columns]
>>>df[(df.A>0.5)&(df.B>0)]
A B C
1 1.717066 2.554761-0.560069
4 0.743068 0.292042-1.002901
[2rowsx3columns]
14 / 26
15. Case Study 1: Ridge Regression
(sklearn.linear_model.Ridge)
, : input, output of training data
: hyper parameter
The optimum is given as:
The corresponding part of the code:
K=safe_sparse_dot(X,X.T,dense_output=True)
try:
dual_coef=_solve_cholesky_kernel(K,y,alpha)
coef=safe_sparse_dot(X.T,dual_coef,dense_output=True).T
exceptlinalg.LinAlgError:
(sklearn.h/linear_model/ridge.py L338-343)
∥y − Xw + α∥wmin
w
∥
2
2
∥
2
2
X y
α
w = ( X + αI yX
T
)
−1
X
T
15 / 26
18. flat
classflatiter(builtins.object)
| Flatiteratorobjecttoiterateoverarrays.
|
| Aflatiteriteratorisreturnedby``x.flat``foranyarrayx.
| Itallowsiteratingoverthearrayasifitwerea1-Darray,
| eitherinafor-looporbycallingitsnextmethod.
|
| IterationisdoneinC-contiguousstyle,withthelastindexvaryingthe
| fastest.Theiteratorcanalsobeindexedusingbasicslicingor
| advancedindexing.
|
| SeeAlso
| --------
| ndarray.flat:Returnaflatiteratoroveranarray.
| ndarray.flatten:Returnsaflattenedcopyofanarray.
|
| Notes
| -----
| AflatiteriteratorcannotbeconstructeddirectlyfromPythoncode
| bycallingtheflatiterconstructor.
In short, x.flatis a reference to the elements of the array x, and can be used
like a one dimensional array.
18 / 26
20. Case Study 2: NMF
(sklearn.decomposition.nmf)
NMF = Non-negative Matrix Factorization
Successful in face part detection
20 / 26
21. Idea of NMF
Approximate the input matrix as a product of two smaller non-negative
matrix:
Notation
Parameter set:
Error function:
X ≈ HW
T
≥ 0, ≥ 0Wij Hij
Θ = (W , H), : i-th element of Θθi
f(Θ) = ∥X − HW
T
∥
2
F
21 / 26
22. Algorithm of NMF
Projected gradient descent (Lin 2007):
where
Convergence condition:
where
(Note: )
= P [ − α∇f( )]Θ
(k+1)
Θ
(k)
Θ
(k)
P [x = max(0, )]i xi
f( ) ≤ ϵ f( )∥
∥∇
P
Θ
(k)
∥
∥
∥
∥∇
P
Θ
(1)
∥
∥
f(Θ) = {∇
P
∇f(Θ)i
min (0, ∇f(Θ ))i
if > 0θi
if = 0θi
≥ 0θi
22 / 26
25. Conclusion
Avoid for-sentence; use NumPy/SciPy's capabilities
Mathematical derivation is important
You can learn a lot from the source code of scikit-learn
25 / 26
26. References
Official
scikit-learn
For beginners of NumPy/SciPy
Gabriele Lanaro, "Python High Performance Programming," Packt
Publishing, 2013.
Stéfan van der Walt, Numpy Medkit
Python Scientific Lecture Notes
Algorithm of NMF
C.-J. Lin. Projected gradient methods for non-negative matrix
factorization. Neural Computation 19, 2007.
26 / 26