跟踪Python循环结果的最佳方法

时间:2012-02-08 21:08:54

标签: python list append tracking

我有一个相当大的循环,需要运行500次,而且我是新手使用编程语言并进行这种类型的模拟。

但是我需要记录每次运行的结果,如果列表(table1)包含全0,全1或两者的混合。

我只是想知道哪种方法最快找出500个模拟的比例,导致列表包含全部0,全部1或混合,如果追加会减慢太多。

for x in range(0, 500):

    times = 300
    gamma_val = 2

    table1 = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    total = 0.0
    while total < times:
        table = [0 for i in range (21)]
        for d1 in range(21):
            if table1[d1]:
               table[d1] = -(1/gamma_val)*math.log((random.random()))
            else:
               table[d1] = -(math.log(random.random()))
      ####Goes on to make new table1 with changes, either all 1's, all 0's or a mix of 0s   #########and 1s

    files1 = 0
    files01 = 0
    files0 = 0

    if "1" "0" in table1 == True:
             files01 += 1
    elif 1 in table == True:
             files1 += 1
    elif 0 in table1 == true:
             files0 += 1

3 个答案:

答案 0 :(得分:0)

为了选择追加的位置,在while循环之前创建2个布尔变量(Has1s和Has0s),每个都初始化为False。每当你得到1&amp; 1时,将Has1s设置为True。当你得到0时有Has0s - 然后你在最后避免(最多)3次搜索。

答案 1 :(得分:0)

最后你到底需要什么?

如果你只是想知道所有1,所有0或混音的比例,那么增加变量值而不是生成列表似乎更直观(至少对我来说)。如果您设置代码如下:

...
files1=0
files01=0
files0=0

if 1 in table1 and 0 in table1:
       files01 += 1
elif 1 in table:
       files1 += 1
elif 0 in table1:
       files0 += 1
...

然后你不必在最后做一个len(files01)来知道有多少人混合了1和0。

答案 2 :(得分:0)

append()没有速度丢失,相比于多次扫描事物所造成的速度损失。与计算相比,内存操作损失的时间非常少。所以不要担心。我可能不会保留计数,如果我可以从你想要累积的列表的长度中得到它们。一次完成所有事情更具可读性。制作东西,然后数数。

我相信标准容器相对于算法速度的决策。所以我将行转换为Set并与Set([0]),Set([1])和Set([0,1])进行比较。我假设'in'将对​​该行进行双重扫描,而Set()将进行一次传递。

BOTH = set([0, 1])
results = {'0': [], '1': [], '01': []}

.... make the list ....


elements = set(table)
if elements == BOTH:
    results['01'].append(table)
else if 1 in elements:
    results['1'].append(table)
else:
    results['0'].append(table)

我会尝试挑选风格,而不是直接错误:

使用最后的其他,不要用尽所有条件;它真的更具可读性。分别耗尽所有这些让读者想知道你想象的可能会留下什么样的情况。它滋生了偏执狂。

一般来说,实际上将事物与True或False进行比较是非pythonic。检查与常量True的相等性是在Python中获取所需条件的最不可靠的方法。有很多Python习语依赖于语句的真实性,它由对象的存在或列表的非空性来表示。因此,您将面对程序员从辅助函数返回True或False以外的东西来表示布尔确定。习惯于不要挑剔。

此外,看似痛苦, 与其他比较运营商链条混合时好像是&lt; ,这对于非分析师来说是非惯用的你应该从不这样做。

相关问题