【问题标题】:Best way to keep track of results from a Python loop跟踪 Python 循环结果的最佳方法
【发布时间】:2012-03-01 08:49:37
【问题描述】:

我有一个相当大的循环需要运行 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

【问题讨论】:

  • 您的代码存在多个问题,难以给出正确答案。 1、压痕坏了。缩进改变了 Python 中程序的含义,如果没有适当的缩进,就不可能推断出正确的含义。 2. if "1" "0" in table1==True: 是有效的,但非常奇怪,而且肯定是非预期的 Python 代码。这段代码应该检查什么? 3. 你没有调用append() 方法——你只是在查找它们。这样,就不可能知道您要附加到列表中的是什么。 4.files1[]等不是有效的Python。
  • 您要在两个循环的中间导入两个东西?
  • @Ben:导入很奇怪,但我们首先必须解决这段代码中更紧迫的问题。 :)
  • “什么方法最快”。是您最不关心的问题。第一的。找点工作。然后。如果速度太慢。使用分析器找出减速是什么。 “担心附加功能可能太慢”是无关紧要的。不要“担心”。测量。
  • 您的while 循环似乎也是无限的。我在循环中没有看到您调整totaltimes 的值。

标签: python list append tracking


【解决方案1】:

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

【讨论】:

  • 我怀疑这会更快。您将执行大量额外的 Python 代码以避免在优化的 C 代码中进行三个“超快速”搜索。 (我无法为代码计时,因为没有工作代码......)
【解决方案2】:

你到底需要什么?

如果您只想知道全 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。

【讨论】:

  • files1 or files01 or files0 always = 0 我必须把它放在错误的缩进处
  • 这是完全错误的。 “1”“0”将字符串连接成“10”,所以你有"10" in table1==True。这也是错误的,因为表达式应该是something in table1,添加==True 会改变它。试试解释器,你会看到的。我必须承认我不确定为什么!
  • 另外,检查整数列表中的字符串总是会返回False
  • 好点 @PeterWood - ifelif 已经返回 TrueFalse。要让它检查 1 和 0,你只需要告诉它两者都做(为 python 的简单性欢呼)
【解决方案3】:

与多次扫描事物的速度相比,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)

我会尽量选择风格,而不是彻底的错误:

使用最后的else,不要穷尽所有条件;它确实更具可读性。分别用尽它们会使读者想知道您想象的情况可能会留下什么。它滋生妄想症。

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

另外,虽然看起来很痛苦,in 当与其他比较运算符链混合时,就好像它意味着 ,这对于非分析师来说太不习惯了,以至于你永远不要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2010-10-18
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多