xiao_feng271 2024-04-17 15:47 采纳率: 100%
浏览 9
已结题

for循环处理大量数据怎么优化

img


我想把上图的csv文件转为下图的csv文件,然后写了一段能用但是在处理较多数据时会导致处理时间过长,加了一个tqdm才发现要这么久。

img


以下是代码,主要问题应该是for循环,求怎么改


from tqdm import tqdm
a=int(input('行数'))
b=int(input('列数'))
import csv
ls1=[]
ls2=[]
#encoding='gbk',errors='ignore'
with open('.\\123.csv','r',newline='') as f:#with open('F:\\py\\project\\pythonProject\\121.csv')
    cr=csv.reader(f)
    for line in cr:
        ls1.append(line)
   # print(ls1)
    for i in tqdm(range(a*b)):#原来的行数乘列数加一len(ls1)*len(ls1[3]+1
        for j in range(0,a):#行
            for k in range(0,b):#列
                ls2.append([ls1[j][k],k,-j])
#print(ls2)
with open('example.csv', mode='w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(['T','X','Y'])
    writer.writerows(ls2)
  • 写回答

9条回答 默认 最新

  • 阿里嘎多学长 2024-04-17 15:48
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的链接内容,问题的核心在于如何优化for循环处理大量数据的代码,以减少处理时间。在CSDN问答中,有几位回答者提供了不同的优化方案,这里我将结合这些方案,给出一个综合性的回答。

    1. 使用列表推导式

    列表推导式是Python中一种优雅且高效的构建列表的方法。它可以用一行代码替代多层嵌套循环,从而提高代码的执行效率。

    from tqdm import tqdm
    
    a = int(input('请输入行数:'))
    b = int(input('请输入列数:'))
    with open('.\\123.csv', 'r', newline='') as f:
        ls1 = list(csv.reader(f))
    
    ls2 = [[row[i], i, -j] for j, row in enumerate(ls1) for i in range(b)]
    with open('example.csv', mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(['T', 'X', 'Y'])
        writer.writerows(ls2)
    

    2. 使用Pandas库

    Pandas是一个强大的数据处理库,它提供了DataFrame结构,可以高效地处理大型数据集。使用Pandas可以避免使用Python原生的循环,从而提高数据处理速度。

    import pandas as pd
    from tqdm import tqdm
    
    df = pd.read_csv('123.csv', header=None, encoding='gbk', error_bad_lines=False)
    num_rows, num_cols = df.shape
    
    new_df = pd.DataFrame({
        'T': [''] * (num_rows * num_cols),
        'X': [0] * (num_rows * num_cols),
        'Y': [0] * (num_rows * num_cols)
    })
    
    index = 0
    for i in tqdm(range(num_rows)):
        for j in range(num_cols):
            new_df.loc[index] = [df.iloc[i, j], j, -i]
            index += 1
    
    new_df.to_csv('example.csv', index=False)
    

    3. 使用NumPy库

    NumPy是一个用于科学计算的库,它提供了多维数组对象和一系列处理数组的函数。对于处理大量数据,使用NumPy可以显著提高性能。

    import csv
    import numpy as np
    
    a = int(input('行数'))
    b = int(input('列数'))
    
    ls1 = []
    with open('.\\123.csv', 'r', newline='') as f:
        for line in csv.reader(f):
            ls1.append(line)
    
    ls1 = np.array(ls1)
    ls2 = np.array([row[i] for row in ls1 for i in range(b)]).reshape(-1, 3)
    ls2[:, 1] = np.arange(b).repeat(b)
    ls2[:, 2] = np.arange(a) * -1
    
    with open('example.csv', mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(['T', 'X', 'Y'])
        writer.writerows(ls2)
    

    4. 多线程或多进程

    对于大规模数据处理,可以考虑使用多线程或多进程来并行处理数据。Python的concurrent.futures模块提供了简单的接口来实现并发执行。

    from concurrent.futures import ProcessPoolExecutor
    import csv
    
    def process_data(start, end):
        with open('.\\123.csv', 'r', newline='') as f:
            reader = csv.reader(f)
            data = [row[start:end] for row in reader]
    
        return data
    
    a = int(input('行数'))
    b = int(input('列数'))
    
    with ProcessPoolExecutor() as executor:
        futures = [executor.submit(process_data, i*b, (i+1)*b) for i in range(a)]
        ls2 = [data for future in futures for data in future.result()]
    
    with open('example.csv', mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(['T', 'X', 'Y'])
        for data in ls2:
            writer.writerow(data)
    

    结论

    以上四种方法都可以有效地优化处理大量数据的代码。您可以根据实际情况和需求选择最合适的方法。列表推导式和Pandas适用于单机单线程的数据处理,而NumPy适用于需要进行数值计算的场景。如果数据量非常大,可以考虑使用多线程或多进程来进一步提高处理速度。在实际应用中,可能需要根据数据的特点和处理需求,结合多种方法来达到最佳的优化效果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月17日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)