标题:各位大神们,下面的代码速度好慢,有什么办法解决一下吗?还是我写的有问题 ...
只看楼主
木木夕之
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-4-23
结帖率:0
已结贴  问题点数:5 回复次数:16 
各位大神们,下面的代码速度好慢,有什么办法解决一下吗?还是我写的有问题,帮忙看一下,谢谢大家。
import pandas as pd
import csv
import numpy as np
import time
start = time.time()
def list_of_groups(init_list, children_list_len):
    list_of_groups = zip(*(iter(init_list),) * children_list_len)
    end_list = [list(i) for i in list_of_groups]
    count = len(init_list) % children_list_len
    end_list.append(init_list[-count:]) if count !=0 else end_list
    return end_list
# 获取id
with open("./A.csv") as f:
    csv_readlines=csv.reader(f,delimiter=',')
    taxi_id = []
    for row in csv_readlines:
        VEHICLEOID = row[1]
        if VEHICLEOID in taxi_id:
            continue
        else:
            taxi_id.append(VEHICLEOID)

    taxi_id.remove("VEHICLEOID")

    print(taxi_id)
    print(len(taxi_id))
   
end = time.time()
print("Elapsed (after compilation) = %s" % (end - start))

all_count = []

for tx_id in range(len(taxi_id)):
    LoadStatus = []
    with open("./A.csv") as f:
        csv_readlines=csv.reader(f,delimiter=',')
        for rows in csv_readlines:
            if rows[1] == taxi_id[tx_id]:
                LoadStatus.append(rows[14])
        print(LoadStatus)
  
        i = 0
        taxi_count = []
        while i <= len(LoadStatus) - 3:
            i += 1
            if LoadStatus[i] == "0" and LoadStatus[i + 1] == "1":
                taxi_count.append(i+1)
                #i += 1
            if len(taxi_count):
                if LoadStatus[i] == "1" and LoadStatus[i + 1] == "0":
                    taxi_count.append(i)
                    
        list_c = [0] * len(LoadStatus)
        taxi_num = list_of_groups(taxi_count,2)
        taxi_sta = 1
        if len(taxi_num) and len(taxi_count)%2 == 0:
            for i in taxi_num:
                #print(i[1] - i[0] + 1)
                if i[1] - i[0] + 1 >= 15:
                    list_c[i[0]:i[1]+1] = [taxi_sta] * (i[1] - i[0] + 1)
                    taxi_sta += 1
                else:
                    list_c[i[0]:i[1] + 1] = [0] * (i[1] - i[0] + 1)

        if len(taxi_num) and len(taxi_count)%2 == 1:
            for i in taxi_num:
               
                if len(i) == 2 and i[1] - i[0] + 1 >= 15:
                    #print(i[1] - i[0] + 1)
                    list_c[i[0]:i[1]+1] = [taxi_sta] * (i[1] - i[0] + 1)
                    taxi_sta += 1
                else:
                    list_c[i[0]:len(LoadStatus)+1] = [0] * (len(LoadStatus) - i[0])
        
    all_count.extend(list_c)
print(all_count)
   

               
               
            
   
搜索更多相关主题的帖子: csv time for if print 
2019-04-23 16:40
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:3 
你这是要干啥呢 也不说一下
python 运行慢是正常的  

DO IT YOURSELF !
2019-04-24 08:30
木木夕之
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-4-23
得分:0 
回复 2楼 wp231957
处理数据的,目的是:
一个csv文件,要根据其中两列(一列为id,一列为状态),写出第三列(新列名称为次数)。
判断的依据是:
①:id相同时,看状态这一列(该列只有0和1),如果该列的数值从0变成1,再由1变成0,并且这部分行数超过15行,第三列记一次。循环,再次出现这种情况时,记2,……以此类推。若没超过15行,第三列记0
②:如果只有0变成1,没有对应的1变成0,第三列记0;如果有1变成0,前面没有0变成1的,第三列记0
2019-04-24 11:49
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 3楼 木木夕之
听起来 挺乱啊  看看数据量有多少呢(excel总行数,这个值如果很大的话  那就不会很快)

方便的话 可以放出部分数据

DO IT YOURSELF !
2019-04-24 14:48
木木夕之
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-4-23
得分:0 
回复 5楼 wp231957
几千万条数据,我试了100万条,花了我30分钟。然后几千万条的,一天了都没跑完。
结果 - 副本.zip (699 Bytes)

这个文件第三列就是结果。id为4,id为5,id为12的出现我上头说的那种情况。
2019-04-24 14:54
木木夕之
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-4-23
得分:0 
回复 5楼 wp231957
几千万条数据,我试了100万条,花了我30分钟。然后几千万条的,一天了都没跑完。
结果 - 副本.zip (699 Bytes)

这个文件第三列就是结果。id为4,id为5,id为12的出现我上头说的那种情况。
2019-04-24 14:54
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用木木夕之在2019-4-24 11:49:57的发言:
①:id相同时,看状态这一列(该列只有0和1),如果该列的数值从0变成1,再由1变成0,并且这部分行数超过15行,第三列记一次。循环,再次出现这种情况时,记2,……以此类推。若没超过15行,第三列记0
②:如果只有0变成1,没有对应的1变成0,第三列记0;如果有1变成0,前面没有0变成1的,第三列记0



太复杂了,看的头都疼,

目测几千万条记录,不会很快,尤其是用python
也许用vba能快一些,你可以把你的代码移植到vba上试一下

DO IT YOURSELF !
2019-04-24 15:14
木木夕之
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-4-23
得分:0 
回复 7楼 wp231957
我没用过vba,你知道怎么能够加速python 运行吗?我找了一下,多线程的,但是不懂怎么加到代码上去
2019-04-24 15:27
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
excel表 容纳不了1000万条数据吧,你是有多个文件吧

DO IT YOURSELF !
2019-04-24 15:46
木木夕之
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2019-4-23
得分:0 
回复 9楼 wp231957
不是Excel表,是csv文件
2019-04-24 15:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-494370-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.150695 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved