2017-10-24 5 views
0

test1b()がtest1a()よりもずっと高速である理由は誰にも分かりますか?どの回線がボトルネックであるかを特定し、それをスピードアップする代替機能を選択するにはどうすればよいですか?あなたを減速だラインがパンダapply機能であなたの経験Benchmark and this Python code

import numpy as np 
import pandas as pd 
import time 

def test1a(): 
    cols = 13 
    rows = 10000000 
    raw_data = np.random.randint(2, size=cols * rows).reshape(rows, cols) 
    col_names = ['v01', 'v02', 'v03', 'v04', 'v05', 'v06', 'v07', 
       'v08', 'v09', 'v10', 'v11', 'v12', 'outcome'] 
    df = pd.DataFrame(raw_data, columns=col_names) 
    df['v11'] = df['v03'].apply(lambda x: ['t1', 't2', 't3', 't4'][np.random.randint(4)]) 
    df['v12'] = df['v03'].apply(lambda x: ['p1', 'p2'][np.random.randint(2)]) 
    return df 


def test1b(): 
    cols = 13 
    rows = 10000000 
    raw_data = np.random.randint(2, size=(rows,cols)) 
    col_names = ['v01', 'v02', 'v03', 'v04', 'v05', 'v06', 'v07', 
       'v08', 'v09', 'v10', 'v11', 'v12', 'outcome'] 
    df = pd.DataFrame(raw_data, columns=col_names) 
    df['v11'] = np.take(
     np.array(['t1', 't2', 't3', 't4'], dtype=object), 
     np.random.randint(4, size=rows)) 
    df['v12'] = np.take(
     np.array(['p1', 'p2'], dtype=object), 
     np.random.randint(2, size=rows)) 
    return df 


start_time = time.time() 
test1a() 
t1a = time.time() - start_time 

start_time = time.time() 
test1b() 
t1b = time.time() - start_time 

print("Test1a: {}sec, Test1b: {}sec".format(t1a, t1b)) 

答えて

2

を共有してください。 あなただけの究極的

%timeit df['v11'] = np.take(
    np.array(['t1', 't2', 't3', 't4'], dtype=object), 
    np.random.randint(4, size=rows)) 

pandas.apply

%timeit df['v11'] = df['v03'].apply(lambda x: ['t1', 't2', 't3', 't4'][np.random.randint(4)]) 

を比較し、ipython%のはtimeit機能でそれをプロファイルできことはあなたのコードnumpyの実装ができる方法をベクトル化することができず、かつにおける結果dtypesを計算し、各繰り返しでPythonインタプリタを再呼び出しする際のオーバーヘッドが大きくなります。