功能非常慢

时间:2014-08-26 01:33:01

标签: python performance parsing web-scraping bigdata

我一直在寻找巴西股票市场的历史数据,并在Bovespa's找到它 网站。 问题是数据的格式很糟糕,它与各种各样的混合 有关任何特定股票的其他信息! 到现在为止还挺好!一个很好的机会来测试我的新python技能(或者我认为)! 我设法用几行代码“组织/解析”几乎所有的数据, 然后偶然发现了一个关于数据的非常烦人的事实。我需要的信息,股票价格(开盘价,最高价,最低价,收盘价),没有逗号,格式如下:0000000011200,相当于十进制逗号前的11位数。 所以基本上0000000011200 = 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

有人会介意对此事发光吗?

2 个答案:

答案 0 :(得分:3)

datas.index(entry)

有你的问题。 datas.index(entry)要求Python一次查看datas个列表中的一个元素,搜索entry。这是一种非常缓慢的做事方式,列表越大越慢,而且它甚至不起作用,因为重复的元素总是在它们第一次出现时找到,而不是你正在处理的事件。

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

for index, entry in enumerate(datas):
    ...

答案 1 :(得分:1)

首先,可能更容易将价格直接转换为更实用的格式。 例如,十进制格式允许您在不丢失精度的情况下进行简单计算。 其次,我认为你甚至不需要索引,只能使用追加。 第三,欢迎列表理解和切片: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]

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

相关问题