【问题标题】:Efficiently count list entries that are smaller than a given value有效计算小于给定值的列表条目
【发布时间】:2015-06-14 12:04:05
【问题描述】:

我有两个列表,一个包含员工工资,一个包含查询。对于每个查询,我想打印有多少员工的薪水低于这个数字。

您可以在下面找到我目前使用的代码,这超出了我对大输入的时间限制。因此,我正在寻找更有效的解决方案。

sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
    count = 0
    for ep in sal:
        if ep < i:
            count +=1
    print count

【问题讨论】:

  • 你可以看看 SQL-Databases,比如sqlite
  • 如果您首先使用raw_input() 获取数据,我认为这比实际的双循环花费的时间要长得多。您如何将数据输入到您的程序中?
  • 我将输入作为整数。首先是员工人数,然后是价值观。
  • 我们在谈论多少个项目和什么时间限制?对于有关性能优化的问题,通常建议使用分析器来识别应用程序的实际慢速部分。试试 cProfile 和 gprof2dot。

标签: python performance list python-2.7


【解决方案1】:

我不知道这是否会比您的解决方案更快(或更慢)。您可以使用timeit 模块来确定您的大输入。

sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
   print sum(1 for s in sal if s < i)

根据数据大小,您可以预先对工资和查询进行排序,然后您只需遍历列表:

idx = 0
sal = sorted(sal)
count = 0
for q in sorted(queries):
    while sal[idx] < q:
        count += 1
        idx += 1
    print count

第二种方法对于较长的输入会更快,但对于较短的输入可能会更慢 - 您必须使用代表性数据进行分析。如果您的数据已经排序,此方法将非常快。

【讨论】:

    【解决方案2】:
    sal = [int(raw_input()) for x in range(num_employees)]
    q = [int(raw_input()) for x in range(num_queries)]
    for i in q:
        count = sum([1 for for ep in sal if ep < i])
        print count
    

    【讨论】:

      【解决方案3】:

      在已排序的sal 列表上使用bisect

      import bisect
      
      sal = [int(raw_input()) for x in range(num_employees)]
      q = [int(raw_input()) for x in range(num_queries)]
      sal.sort()
      for i in q:
          print bisect.bisect_left(sal, i)
      

      bisect 进行对数搜索,其中sal &lt; i 的最大元素是。对于大型列表,复杂度是 O(N * log(N)) 而不是 O(N ** 2) 对于具有两个 for 循环的其他解决方案。这对于大量数字N 来说要快得多。

      【讨论】:

        猜你喜欢
        • 2012-08-26
        • 2016-06-28
        • 2019-05-15
        • 2016-10-03
        • 2023-04-06
        • 1970-01-01
        • 2011-11-28
        • 2011-10-07
        • 1970-01-01
        相关资源
        最近更新 更多