[Python3/numpy] pandas에서 병렬 연산하는 것보다 frompyfunc가 빠릅니까? (하지만 불편했다)
환경
버전
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개의 때 밖에, 속도 개선은 바라지 않을 것 같다.
사용한다면
결론을 한마디로 말하면, 사용 장소는 미묘했습니다.
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개의 때 밖에, 속도 개선은 바라지 않을 것 같다.
사용한다면
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 になってた
이 처리 변경에 의해 속도가 저하되지 않을까 걱정이었기 때문에, 만약을 위해 이하의 기사의 방법으로 속도 측정해 보았다.
【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
쪽이 느린 일도 있을지도 모른다.그렇다고는 해도, 상당한 차이가 붙어 있으므로, 기본적으로는
frompyfunc
쪽이 빠르자. 실제로 간단한 처리라도 조사하면 추기하려고 한다.
Reference
이 문제에 관하여([Python3/numpy] pandas에서 병렬 연산하는 것보다 frompyfunc가 빠릅니까? (하지만 불편했다)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/siruku6/items/976d228797576234e839텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)