Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行非常慢_Python_Performance_Parsing_Web Scraping_Bigdata - Fatal编程技术网

Python 运行非常慢

Python 运行非常慢,python,performance,parsing,web-scraping,bigdata,Python,Performance,Parsing,Web Scraping,Bigdata,我在寻找巴西股市的历史数据,在Bovespa的 网站。 问题是数据的格式很糟糕,它混合了各种各样的数据 关于任何特定股票的其他信息! 到现在为止,一直都还不错!这是一个测试我新的python技能的好机会(至少我是这么认为的)! 我用几行代码“组织/解析”了几乎所有的数据, 然后偶然发现了一个关于数据的非常恼人的事实。我需要的信息,股票价格(开盘价、高点、低点、收盘价),没有逗号,格式如下:00000000 11200,相当于小数点前的11位数字。 所以基本上000000011200=112,00

我在寻找巴西股市的历史数据,在Bovespa的 网站。 问题是数据的格式很糟糕,它混合了各种各样的数据 关于任何特定股票的其他信息! 到现在为止,一直都还不错!这是一个测试我新的python技能的好机会(至少我是这么认为的)! 我用几行代码“组织/解析”了几乎所有的数据, 然后偶然发现了一个关于数据的非常恼人的事实。我需要的信息,股票价格(开盘价、高点、低点、收盘价),没有逗号,格式如下:00000000 11200,相当于小数点前的11位数字。 所以基本上000000011200=112,00。。。你明白要点了

我写了几行代码来编辑它,然后噩梦开始了。 整个数据集大约有358K行长,使用我当前的脚本,数据集就越深 在列表中运行以对其进行编辑每次编辑所需的时间越长

这是我用来做这件事的代码:

@profile
def dataFix(datas):
    x = 0
    for entry in datas:
        for i in range(9, 16):
            data_org[datas.index(entry)][i] = entry[i][:11]+'.'+entry[i][11:]
        x += 1
        print x
有人介意透露一下这件事吗

datas.index(entry)
这是你的问题
datas.index(entry)
要求Python遍历
datas
一次列出一个元素,搜索
entry
。这是一种非常慢的处理方式,列表越大,速度越慢,甚至不起作用,因为重复的元素总是在它们的第一次出现时找到,而不是在您处理的出现时

如果要使用循环中元素的索引,请使用:


首先,可能更容易将价格直接转换为更有用的格式。 例如,十进制格式允许您在不降低精度的情况下轻松计算。 其次,我认为您甚至不需要索引,只需使用append即可。 第三,说欢迎列表理解和切片:P

from decimal import Decimal

data_org = []
for entries in datas:
    data_org.append([Decimal(entry).scaleb(-2) for entry in entries[9:16]])
甚至:

data_org = [[Decimal(entry).scaleb(-2) for entry in entries[9:16]] for entries in datas]
或以生成器形式:

data_org = ([Decimal(entry).scaleb(-2) for entry in entries[9:16]] for entries in datas)
或者,如果要保留文本表单:

data_org = [['.'.join((entry[:-2], entry[-2:])) for entry in entries[9:16]] for entries in datas]

(将[:11]替换为[:-2]允许独立于输入大小,并从末尾得到2个小数)

噢,抱歉,x只是一个计数器变量,我用来可视化每次迭代的进度,只是为了确保它实际上是在减速。什么是
data_org[datas.index(entry)][I]
do?它引用了我要更改的数据组织列表中的位置。数据组织列表中的每个项目都是一个包含特定库存信息的列表。考虑到这一点,我想将data_org中每个项目的位置从9改为15。因此,对于data_org的第一个成员,我想更改data_org[1][9]——data_org[1][15],每个成员对应一个价格。此外,数据与data_org.little grammar nip相同:数据已经是复数了。数据是数据的复数形式。真漂亮!谢谢大家,代码现在运行得很快。当你是一个不速之客的时候,很容易忘记python中的这些原始函数,它们只会让你的生活变得简单。太棒了!至少对我来说,这是一些复杂的代码,但我确实理解列表理解是如何使事情顺利进行的。但是有一件事需要指出。。我确实运行了您的代码片段,但我的解释器抛出了一个错误。InvalidOperation:Decimal:'OPEN'无效的文字。抱歉,请考虑我最后一条注释,我愚蠢到不能考虑到数据组织的第一个项目是一个包含列标题的列表,以供db使用。尽管现在我可以运行代码,我用列表理解运行了这个版本,它花费了很长时间。知道为什么吗?呃,没想到。。。十进制除法真的很慢。使用scaleb方法进行更改。应该更好
data_org = [['.'.join((entry[:-2], entry[-2:])) for entry in entries[9:16]] for entries in datas]