Skip to main content
 首页 » 编程设计

用于 sql 插入的 Python 代码优化

2025年05月04日20artech

我有以下代码,我在一些大数据上运行它(2 小时的处理时间),我正在研究 CUDA 的 GPU 加速,但同时有人可以建议优化以下代码的方法吗?

我正在从数据集“T”中获取一个 3D 点,并找到与另一个点数据集“B”的距离最短的点

先将结果发送到列表,然后再插入到数据库表中,是否可以节省时间?

欢迎所有建议

    conn = psycopg2.connect("<details>") 
    cur = conn.cursor() 
 
    for i in range(len(B)): 
        i2 = i + 1 
        # point=T[i] 
        point = B[i:i2] 
        # print(B[i]) 
        # print(B[i:i2]) 
        disti = scipy.spatial.distance.cdist(point, T, metric='euclidean').min() 
        print("Base: ", end='') 
        print(i, end='') 
        print(" of ", end='') 
        print(len(B), end='') 
        print(" ", end='') 
        print(disti) 
 
        cur.execute("""INSERT INTO pc_processing.pc_dist_base_tmp (x,y,z,dist) values (%s, %s, %s, %s)""", 
                    (xi[i], yi[i], zi[i], disti)) 
        conn.commit() 
 
    cur.close() 

@@@@@@@@@@@@@@编辑@@@@@@@@@@@@

代码更新:

   conn = psycopg2.connect("dbname=kap_pointcloud host=localhost user=postgres password=Gnob2009") 
    cur = conn.cursor() 
 
    disti = [] 
 
    for i in range(len(T)): 
        i2 = i + 1 
        point = T[i:i2] 
        disti.append(scipy.spatial.distance.cdist(point, B, metric='euclidean').min()) 
        print("Top: " + str(i) + " of " + str(len(T))) 

在我弄清楚语法后插入代码以转到此处

@@@@@@@@编辑@@@@@@@@

解决方案在 Alex 的大力帮助下

   cur = conn.cursor() 
      # list for accumulating  insert-params 
    from scipy.spatial.distance import cdist 
 
    insert_params = [] 
    for i in range(len(T)): 
        XA = [B[i]] 
        disti = cdist(XA, XB, metric='euclidean').min() 
        insert_params.append((xi[i], yi[i], zi[i], disti)) 
        print("Top: " + str(i) + " of " + str(len(T))) 
 
    # Only one instruction to insert everything 
    cur.executemany("INSERT INTO pc_processing.pc_dist_top_tmp (x,y,z,dist) values (%s, %s, %s, %s)", 
                    insert_params) 
    conn.commit() 

对于时序比较:

初始代码占用:0:00:50.225644

没有多行打印:0:00:47.934012

将提交退出循环:0:00:25.411207

我假设让它更快的唯一方法是让 CUDA 工作?

请您参考如下方法:

有2种解决方案

1) 如果 len(B) 非常大,尝试进行单次提交或分块提交。

2) 您可以准备要插入的数据列表并进行批量插入。

例如:

insert into pc_processing.pc_dist_base_tmp (x, y, z, dist) select * from unnest(array[1, 2, 3, 4], array[1, 2, 3, 4]);