喵喵时光机
cuDF Dataframe 提供了一种apply_rows方法,它能够将方法编译到内核中并在 GPU 上执行。此功能于去年 1 月实施。import cudfimport numpyrows = 20000000df = cudf.DataFrame([ ('a_in', list(range(rows))), ('b_in', list(reversed(range(rows)))), ('c_in', list(range(rows)))])def kernel(a_in, b_in, c_in, dot): for i, (a, b, c) in enumerate(zip(a_in, b_in, c_in)): dot[i] = a * b * cdf = df.apply_rows( kernel, incols=['a_in', 'b_in', 'c_in'], outcols=dict(dot=numpy.float64), kwargs=dict())[x for x in df['dot']]普鲁斯[0.0, 18.0, 68.0, 144.0, 240.0, 350.0, 468.0, 588.0, 704.0, 810.0, 900.0, 968.0, 1008.0, 1014.0, 980.0, 900.0, 768.0, 578.0, 324.0, 0.0]至于计算点积...import cudfimport numpyimport pandasrows = 20000000values_a = [float(x) for x in list(range(rows))]values_b = [float(x) for x in list(reversed(range(rows)))]values_c = [float(x) for x in list(range(rows))]def create_cudf_dataframe(): return cudf.DataFrame([ ('a_in', values_a), ('b_in', values_b), ('c_in', values_c) ])def create_pandas_dataframe(): return pandas.DataFrame( data = { 'a_in': values_a, 'b_in': values_b, 'c_in': values_c } )def test_cudf(df = None): print('\ncomputing dot product using cudf') def kernel(a_in, b_in, c_in, dot): for i, (a, b, c) in enumerate(zip(a_in, b_in, c_in)): dot[i] = a * b * c if df is None: print(' - creating dataframe using cudf') df = create_cudf_dataframe() df = df.apply_rows( kernel, incols=['a_in', 'b_in', 'c_in'], outcols=dict(dot=numpy.float64), kwargs=dict(), cache_key='dot_product_3' ) dp = df['dot'].sum() print(dp);def test_pandas(df = None): print('\ncomputing dot product using pandas') if df is None: print(' - creating dataframe using pandas') df = create_pandas_dataframe() a = df['a_in'] b = df['b_in'] c = df['c_in'] dp = a.mul(b).mul(c).sum() print(dp)cudf_df = create_cudf_dataframe()pandas_df = create_pandas_dataframe()%time test_cudf()%time test_cudf(cudf_df)%time test_pandas()%time test_pandas(pandas_df)在 ubuntu@18.04 上的 jupyter 上的性能结果在 i7 6700-k 上运行,具有 32GB 内存和 GTX 1080 ti。computing dot product using cudf - creating dataframe using cudf1.333333066666688e+28CPU times: user 1.78 s, sys: 273 ms, total: 2.06 sWall time: 2.05 scomputing dot product using cudf1.333333066666689e+28CPU times: user 19.4 ms, sys: 24 ms, total: 43.4 msWall time: 43.1 mscomputing dot product using pandas - creating dataframe using pandas1.3333330666666836e+28CPU times: user 7.81 s, sys: 781 ms, total: 8.59 sWall time: 8.57 scomputing dot product using pandas1.3333330666666836e+28CPU times: user 125 ms, sys: 120 ms, total: 245 msWall time: 245 ms