[Python3/numpy] pandas에서 병렬 연산하는 것보다 frompyfunc가 빠릅니까? (하지만 불편했다)

7231 단어 Python3numpy

환경





버전


OS
CentOS7

파이썬
3.8.1

pandas
1.0.1

numpy
1.18.1


개요



결론을 한마디로 말하면, 사용 장소는 미묘했습니다.
pandas의 병렬 연산을 numpy.frompyfunc() 로 옮겨놓을 때의 기록입니다.

경위



어느 개발중, pandas로 병렬 연산하고 있던 부분을 다른 메소드로부터도 사용해서 호출하고 싶어져 numpy.frompyfunc() 를 사용했다.

소스의 변경 내용을 간략화하면, 이런 느낌.
import numpy as np
import pandas as pd

# 元々の処理 - pandasによる並列演算を使った処理
def intercomparison_between_dataframes_old(...):
    # 略 ...
    y_exceed_x_series = df1['x'] < df2['y']
    return y_exceed_x_series 

# 書き換え後 - frompyfuncによる処理
def intercomparison_between_dataframes_new(...):
    y_exceed_x = np.frompyfunc(compare, 2, 1)
    y_exceed_x_series = y_exceed_x(df1['x'], df2['y'])
    retutn y_exceed_x_series 

def compare(x, y):
    return x < y


# ※注
#   書き換え前と書き換え後では、処理結果が若干異なる
#
intercomparison_between_dataframes_old(...)

0    False
1    False
2    False
dtype: bool <-

intercomparison_between_dataframes_new(...)

0    False
1    False
2    False
dtype: object <- 速いけど dtype  object になってた

이렇게 하면 무엇이 기쁜가 하면, compare() 메소드를 호출할 수 있는 것으로, 비교 로직만을 사용해 돌릴 수 있다.
Series끼리의 병렬 계산이 아니라, 1대 1로 비교하고 싶은 일도 있습니다(←당초의 목적)
호, 사실은 인수가 6개나 있는 복잡한 비교 처리이니까요! (>д<;)

속도를 측정해 보았습니다.



이 처리 변경에 의해 속도가 저하되지 않을까 걱정이었기 때문에, 만약을 위해 이하의 기사의 방법으로 속도 측정해 보았다.

【Python】 처리에 걸리는 시간을 측정하여 표시

결과



old_dealtelapsed_time이 원래 처리의 처리 시간
new_dealtelapsed_time이 재 작성 후 처리의 처리 시간



「에, pandas보다 frompyfunc쪽이 빠르잖아♪(^^*)라키」

처리 시간이 약 7분의 1이 되었습니다.
예상치 못한 수확이었습니다.

조금 빠르지만,
「이제 병렬 연산은 전부 frompyfunc 로 좋지 않을까....(`・д´・;)」
라고 생각해 버렸습니다.

그런데...

추가 조사에서 알게 된 것



처리 결과를 조사하고 있어 알 수 있었다.

frompyfunc에 건네주는 메소드의 반환값이 2개(이상)일 때, 반환값의 형태가 튜플(tupple)이 된다.

예를 들면 이번의 예로 하면, compare() 메소드의 반환값이 2개였다고 하면 반환값이 이런 느낌이 된다
>>> intercomparison_between_dataframes_new(...)

(0            True
1            False
2            True
3            False
4            False
          ...   
1553    True
1554    True
1555    True
1556    False
1557    True
Length: 1558, dtype: object, 0           True
1           False
2           True
3           False
4           True
         ...   
1553    True
1554    False
1555    False
1556    True
1557    False
Length: 1558, dtype: object) <- tupple かよぉ....

numpy 메서드이기 때문에 2 차원 ndarray를 반환한다고 생각 했는데 ...

frompyfunc()에 건네주는 메소드의 반환값이 1개의 때 밖에, 속도 개선은 바라지 않을 것 같다.

사용한다면


  • frompyfunc() 에 건네주는 메소드의 반환값이 1개라면 적당히 사용할 수 있을 것 같다.

  • 혹시...
    처리에 따라서는 속도에 큰 차이가 없거나, 반대로 frompyfunc 쪽이 느린 일도 있을지도 모른다.
    그렇다고는 해도, 상당한 차이가 붙어 있으므로, 기본적으로는 frompyfunc 쪽이 빠르자.

  • 실제로 간단한 처리라도 조사하면 추기하려고 한다.

    좋은 웹페이지 즐겨찾기