- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设那首歌 i
已播放f
i 次,但 Zipf 定律预测它会玩过z
i 次。然后定义歌曲的质量 i
成为q
我 = f
我/z
<子>我
.你的软件应该选择最高值为q
的歌曲我。
第一行输入包含两个整数n
和 m
( 1 <= n < 50 000
, 1 <= m <= n
),专辑中歌曲的数量,以及要选择的歌曲数量。然后关注n
线。 i
第 'th 这些行包含一个整数 f
i 和字符串 s
i,其中0 <= f
我 < 10^12
是 i
的次数听了这首歌,s
i 是歌曲的名称。每首歌曲名称最多 30 个字符,且仅由字符 a-z
组成, 0-9
, 和下划线 ( _
)。
输出质量最高的m首歌曲列表q
i,按质量降序排列。如果两首歌的质量相同,则优先考虑专辑中首先出现的歌曲(大概是制作人将这首歌放在另一首之前的原因)。
sample input
4 2
30 one
30 two
15 three
25 four
sample output
four
two
我是 python 的新手,我正在尝试解决这个难题,我认为我得到了正确的答案,但我必须更快地完成,有什么建议吗?
from __future__ import division
def main():
import sys
from operator import itemgetter
data = sys.stdin.readlines()
line1 = data[0].split(" ")
numberofselect = line1[1]
qualitydict = {};
songdict = {};
a = 0
for x in range(1, len(data)):
item = data[x].split(" ");
item1 = item[1].split("\n");
f = float(item[0])
z = float(1/x)
qualitydict[item1[0]] = (f/z)
if ((f/z) in songdict.keys()):
songdict[(f/z)].append(item1[0])
else:
songdict[(f/z)] = [item1[0]]
items = songdict.items()
items.sort(key = itemgetter(0), reverse=True)
for key, value in items:
for element in value:
if (a < int(numberofselect)):
print element
a = a + 1
main();
最佳答案
您可以在可读性和性能方面做很多改进[未测试]:
from __future__ import division
import sys
from operator import itemgetter
from collections import defaultdict
def main():
line1 = sys.stdin.readline().split(" ")
numberofselect = int(line1[1])
qualitydict = {}
songdict = defaultdict(list)
for x, line in enumerate(sys.stdin, start=1):
tokens = line.split()
val = float(tokens[0]) * x
qualitydict[tokens[1]] = val
songdict[val].append(tokens[1])
items = songdict.items()
items.sort(key=itemgetter(0), reverse=True)
a = 0
for key, value in items:
for element in value:
if a < numberofselect:
print element
a += 1
main()
特别是:
为 songdict
使用 defaultdict
。如果键不存在,它将自动创建一个新的 list
值。另外:不要使用 key in your_dict.keys()
来查看某个键是否在字典中,因为该检查是 O(n)
。使用 key in your_dict
这需要 O(1)
时间。请注意,使用 defaultdict
您根本不需要进行检查,它已经为您完成了。
您将 z
定义为 1/x
然后您执行 f/z
,但这与执行相同f * x
,唯一的区别是后者会更精确(x
是一个整数,所以做1/x
会损失一些精度)。
我想知道是否有必要使用 op.itemgetter(0)
对项目进行排序。我的意思是,元素是元组,因此它们将首先按第一个键排序,然后按第二个键排序,结果将是您想要按质量 和 字母顺序排序的歌曲(当质量是不止一首歌曲相同)。请注意,即使您可能认为使用 op.itemgetter(0)
进行排序会更快,但我认为这不一定是真的,因为您为每个元素添加了一个函数调用,而 python 必须使用一些空间来保留键值。
事实上,如果我们检查时间:
>>> timeit.timeit('L.sort()', 'import random;L = [(random.randint(0, 100), i) for i in range(3000)]', number=10000)
1.3252038955688477
>>> timeit.timeit('L.sort(key=operator.itemgetter(0))', 'import random;import operator;L = [(random.randint(0, 100), i) for i in range(3000)]', number=10000)
2.926893949508667
增加大小,itemgetter
版本的性能会提高,但您必须仔细检查它在哪一点变得更好,因为即使有 50000
元素:
>>> timeit.timeit('L.sort()', 'import random;L = [(random.randint(0, 1000), i) for i in range(50000)]', number=1000)
13.771193027496338
>>> timeit.timeit('L.sort(key=operator.itemgetter(0))', 'import random;import operator;L = [(random.randint(0, 1000), i) for i in range(50000)]', number=1000)
21.419496059417725
line.split()
参数不以任何空格分割。例如:
>>> 'A string with some space,\ttabs and \n\n newlines'.split()
['A', 'string', 'with', 'some', 'space,', 'tabs', 'and', 'newlines']
这完全不同于:
>>> 'A string with some space,\ttabs and \n\n newlines'.split(' ')
['A', 'string', 'with', '', '', 'some', '', '', '', 'space,\ttabs', 'and', '\n\n', 'newlines']
关于python - 优化 python 代码以提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063577/
我正在比较工作簿中的工作表。该工作簿有两张名为 PRE 和 POST 的工作表,每张工作表都有相同的 19 列。行数每天都不同,但特定一天的两张表的行数相同。该宏将 PRE 工作表中的每一行与 POS
我有一个对象数组,我一次循环遍历该数组一个对象,然后进行几次检查以查看该数组中的每个对象是否满足特定条件,如果该对象满足此条件,则复制一个属性将此对象放入数组中(该属性还包含另一个对象)。 for(v
我正在编写一个必须非常快的应用程序。我使用 Qt 5.5 和 Qt Creator,Qt 的 64 位 MSVC2013 编译版本。 我使用非常困倦的 CS 来分析我的应用程序,我看到占用最多独占时间
我有以下 CountDownTimer 在我的 Android 应用程序中不断运行。 CountDownTimer timer_status; timer_status = new CountDown
有一个优化问题,我必须调用随机森林回归器的预测函数数千次。 from sklearn.ensemble import RandomForestRegressor rfr = RandomForestR
我正在努力提高现有 Asp.Net Web 应用程序的数据访问层的性能。场景是。 它是一个基于 Web 的 Asp.Net 应用程序。 数据访问层使用 NHibernate 1.2 构建并作为 WCF
我在我的 Intel Edison 上运行 Debian,并尝试使用 ffmpeg 通过 USB 网络摄像头捕获视频。我正在使用的命令是: ffmpeg -f video4linux2 -i /dev
我有一个 For循环遍历整数 1 到 9 并简单地找到与该整数对应的最底部的条目(即 1,1,1,2,3,4,5 将找到第三个“1”条目)并插入一个空白行。我将数字与仅对应于此代码的应用程序的字符串“
我有一个带有非规范化架构(1 个表)的 postgresql 数据库,其中包含大约 400 万个条目。现在我有这个查询: SELECT count(*) AS Total, (SELECT c
在 Ltac 中实现复杂的策略时,有一些 Ltac 命令或策略调用我预计会失败以及预期失败(例如终止 repeat 或导致回溯)。这些故障通常在故障级别 0 时引发。 更高级别引发的故障“逃避”周
我正在尝试提高 ansible playbook 的性能。我有一个测试剧本如下: --- - name: Test hosts: localhost connection: local g
我正在使用 axios从 Azure 存储 Blob 下载文件 (~100MB)。 axios({ method: 'get', url: uri, onDownloadProgress:
我有一个 ClojureScript 程序,主要对集合执行数学计算。它是在惯用的、独立于主机的 Clojure 中开发的,因此很容易对其进行基准测试。令我惊讶的是(与答案对 Which is fast
我有一个程序必须在硬件允许的情况下尽快发出数千个 http 请求。在现实世界中,这些连接中的每一个都将连接到一个离散的服务器,但我已经编写了一个测试程序来帮助我模拟负载(希望如此)。 我的程序使用 A
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在计算 Clojure 中 3d 点云的边界框。点云表示为 Java 原始浮点数组,点云中的每个点都使用 4 个浮点存储,其中最后一个浮点未使用。像这样: [x0 y0 z0 u0 x1 y1
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在尝试使用rayshader 包制作图像。我很高兴能够使用如下代码创建一个 png 文件: library(ggplot2) library(rayshader) example_plot <-
更新 显然,jQuery 模板可以被编译,并且它有助于显示带有 if 语句 的模板的性能 here . 但是如图here ,预编译的 jQuery 模板对我的情况没有多大作用,因为我的模板不包含逻辑
我是编程新手。我有一个启用分页的 ScrollView ,其中包含许多页面(最多十个),并且在每个页面上都有一个自定义按钮。每个自定义按钮都有一个自定义图像。我在 Interface Builder
我是一名优秀的程序员,十分优秀!