关于python排序效率的一个问题

关于python排序效率的一个问题,python,sorting,Python,Sorting,好的,我正在做一个基于命令行的网站搜索功能的实现。该网站有一个按字母顺序排列的所有链接的列表 用法大概是 ./find.py LinkThatStartsWithB 因此,它将导航到与字母B相关的网页。 我的问题是,使用用户输入并导航到网页的最有效/最智能的方式是什么 我最初的想法是使用列表,然后获取单词的第一个字母,并使用数字标识符告诉列表索引中的位置 (A=1,B=2…) 示例代码: #Use base url as starting point then add extension o

好的,我正在做一个基于命令行的网站搜索功能的实现。该网站有一个按字母顺序排列的所有链接的列表

用法大概是

./find.py  LinkThatStartsWithB
因此,它将导航到与字母B相关的网页。 我的问题是,使用用户输入并导航到网页的最有效/最智能的方式是什么

我最初的想法是使用列表,然后获取单词的第一个字母,并使用数字标识符告诉列表索引中的位置

(A=1,B=2…) 示例代码:

#Use base url as starting point then add extension on end.
Base_URL = "http://www.website.com/"

#Use list index as representation of letter
Alphabetic_Urls = [
       "/extensionA.html",
       "/extensionB.html",
       "/extensionC.html",
       ]
还是字典会是更好的选择

谢谢你的字典! O(1)

字典!
O(1)

这里最聪明的方法就是让代码读起来最简单。当一个列表中只有26项时,谁会在乎它使用什么算法来浏览呢?你必须使用一些非常非常愚蠢的东西来让它对性能产生影响

如果您真的对性能感兴趣,那么您需要对不同的选项进行基准测试。仅仅看复杂性并不能说明全部情况,因为它隐藏了相关的因素。例如,字典查找将涉及计算键的哈希值,在表中查找,然后检查相等性。对于短列表,简单的线性搜索有时可能更有效,这取决于哈希算法的成本


如果你的例子真的很准确,你能不能只取输入字符串的第一个字母,然后从中预测URL?(
“/extension”+letter+”.html“

这里最聪明的方法就是让代码最容易阅读。当一个列表中只有26项时,谁会在乎它使用什么算法来浏览呢?你必须使用一些非常非常愚蠢的东西来让它对性能产生影响

如果您真的对性能感兴趣,那么您需要对不同的选项进行基准测试。仅仅看复杂性并不能说明全部情况,因为它隐藏了相关的因素。例如,字典查找将涉及计算键的哈希值,在表中查找,然后检查相等性。对于短列表,简单的线性搜索有时可能更有效,这取决于哈希算法的成本


如果你的例子真的很准确,你能不能只取输入字符串的第一个字母,然后从中预测URL?(
“/extension”+letter+”.html“

如果您拥有(并且将始终拥有)少量项目,那么字典将是一个不错的选择。如果URL的列表将来要扩展,您可能实际上希望按URL的字母对其进行排序,然后将输入与之匹配,而不是为每个URL硬编码字典

如果您有(并且将一直有)少量条目,那么字典将是一个不错的选择。如果URL的列表将来要扩展,您可能实际上希望按URL的字母对其进行排序,然后将输入与之匹配,而不是为每个URL硬编码字典

您是如何获得此URL列表的

如果你的命令行应用程序正在网站上搜寻链接,而你只在寻找一个项目,那么建立一个字典是毫无意义的。构建dict所需的时间至少与在运行时进行检查所需的时间相同!例如,只需搜索:

for link in mysite.getallLinks():
    if link[0] == firstletter:
        print link
如果要进行多个搜索(而不仅仅是一个命令行参数),那么使用以下内容构建字典可能是值得的:

import collections
d=collections.defaultdict(list)
for link in mysite.getallLinks():
    d[link[0]].append(link)             # Dict of first letter -> list of links

# Print all links starting with firstletter
for link in d[firstletter]:
    print link

虽然只有26个存储桶,但这不会有多大区别。

您是如何获得此URL列表的

如果你的命令行应用程序正在网站上搜寻链接,而你只在寻找一个项目,那么建立一个字典是毫无意义的。构建dict所需的时间至少与在运行时进行检查所需的时间相同!例如,只需搜索:

for link in mysite.getallLinks():
    if link[0] == firstletter:
        print link
如果要进行多个搜索(而不仅仅是一个命令行参数),那么使用以下内容构建字典可能是值得的:

import collections
d=collections.defaultdict(list)
for link in mysite.getallLinks():
    d[link[0]].append(link)             # Dict of first letter -> list of links

# Print all links starting with firstletter
for link in d[firstletter]:
    print link

虽然只有26个桶,但不会有太大的区别。

因为听起来你只谈论26个项目,你可能不必太担心效率。你想出的任何东西都应该足够快

一般来说,我建议尝试使用最接近您的问题域的数据结构。例如,听起来您正试图将字母映射到URL。例如,这是“A”url,这是“B”url。在这种情况下,像dict这样的映射数据结构听起来很合适:

html_files = {
    'a': '/extensionA.html',
    'b': '/extensionB.html',
    'c': '/extensionC.html',
}

虽然在这个确切的示例中,您实际上可以欺骗它并完全跳过数据结构--
'/extension%s.html'%letter.upper()
:)

因为听起来您只谈论26个项目,所以您可能不必太担心效率。你想出的任何东西都应该足够快

一般来说,我建议尝试使用最接近您的问题域的数据结构。例如,听起来您正试图将字母映射到URL。例如,这是“A”url,这是“B”url。在这种情况下,像dict这样的映射数据结构听起来很合适:

html_files = {
    'a': '/extensionA.html',
    'b': '/extensionB.html',
    'c': '/extensionC.html',
}

虽然在这个确切的示例中,您实际上可以欺骗它并完全跳过数据结构--
”/扩展名%s.html'%letter.upper()
:)

,但这就是我指定高效/智能的原因。我还质疑使用其中一种替代另一种是否更好。我一直在努力提高我的编程技能。但我的观点是,高效和最聪明在这里不是一回事。什么代码最简单?遗憾的是,URL没有按任何特定顺序排列。