- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我写了一个简单的函数,它接收实现 .index() 的东西和要检查的字符列表。
我的假设是,由于字符串和元组都是不可变的,因此它们具有相似的性能(或者至少,元组的性能优于列表)。相反,元组似乎等同于列表。这是为什么?
from string import ascii_lowercase
from random import randint
from timeit import Timer
def check_index(st, guesses):
for i in guesses:
st.index(i)
if __name__ == "__main__":
num_checks = 10
lst = [n for n in ascii_lowercase]
st = ascii_lowercase
tup = tuple(lst)
guesses = [ascii_lowercase[randint(0, len(ascii_lowercase)-1)]
for n in xrange(num_checks)]
def run_string():
check_index(st, guesses)
def run_list():
check_index(lst, guesses)
def run_tuple():
check_index(tup, guesses)
t2 = Timer(run_list)
print "List", t2.timeit()
t3 = Timer(run_tuple)
print "Tuple", t3.timeit()
t = Timer(run_string)
print "String", t.timeit()
示例运行(Python 2.7.6)
List 5.26431703568
Tuple 5.28769207001
String 3.16058015823
List 5.30263400078
Tuple 5.17412590981
String 3.17718791962
List 5.21962976456
Tuple 5.35261583328
String 3.22652792931
最佳答案
tl;dr: String index
调用在底层进行了大量优化,不必进行“丰富的比较”。 list
和 tuple
do 都必须这样做;可变性无关紧要。
如果你打开stringobject.c
,可以看到index
调用了string_find_internal
,后者调用了stringlib_find_slice
,后者又调用了stringlib_find
,后者又调用了快速搜索
。
fastsearch
链接到 this page在其评论中,如果您有兴趣,请查看。关于如何 Boyer-Moore 有一些有趣的内容子字符串搜索是在 python 中实现的。但这在您的 1 字符子字符串搜索中并不重要,fastsearch
显式特例:
} else if (mode == FAST_SEARCH) {
for (i = 0; i < n; i++)
if (s[i] == p[0])
return i;
}
非常紧凑的循环,而且紧凑的循环在 C 语言中非常快。
好的,这涵盖了字符串。 tuple
和 list
怎么样?
这次简单多了;这是两种类型都必须执行的循环:
for (i = start; i < stop && i < Py_SIZE(self); i++) {
int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
if (cmp > 0)
return PyInt_FromSsize_t(i);
不只是用==
检查相等性,这个循环必须做PyObject_RichCompareBool
通过循环的每次迭代。我不会详细介绍代码(如果您好奇,请查看 object.c
),但本质上这必须进行一些类型检查,然后查看类型是否实现了丰富的比较,然后调用该比较函数,检查它是否返回了 NotImplemented
单例,最后返回比较结果。
因此,该循环是 index
调用中完成的大部分工作,列表和元组都必须这样做。字符串会作弊。
关于python - 为什么 tuple.index() 的性能与 list.index() 相似?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23665547/
我有一个包含文件名 和文件路径 的元组列表。我想找到重复的 filename(但 filepath 可能不同),即文件名相同但 filepath 可能不同的元组。 元组列表示例: file_info
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
我有一个包含几个字段的自定义结构,我想在快速 switch 语句中对其进行模式匹配,这样我就可以通过将其中一个字段与另一个字段进行比较来自定义匹配正则表达式。 例如鉴于这种结构: struct MyS
我有一种动态元组结构: template //Should only be tuples class DynamicTuple { vector data; //All data is st
这个问题在这里已经有了答案: What and When to use Tuple? [duplicate] (5 个答案) 关闭 8 年前。 我正在查看 Tuple 的在线示例,但我没有看到任何理
在我的项目中我有很多坐标要处理,在二维情况下我发现(cons x y)的构造比(list x y)快和 (vector x y)。 但是,我不知道如何将 cons 扩展到 3D 或更进一步,因为我没有
我有以下 Scala 代码: def f(x: Int, y: Int): Option[String] = x*y match { case 0 => None case n =>
我的直觉告诉我,在一般情况下,只有宏或复杂类型的体操才能解决这个问题。 Shapeless 或 Scalaz 可以在这里帮助我吗?这是 N=2 问题的具体实例,但我正在寻找的解决方案适用于所有合理的
为什么这段 Scala 代码是这样的: class Test { def foo: (Int, String) = { (123, "123") } def bar: Unit
我是 python 和 pygame 的新手,我正在尝试学习向量和类的基础知识,但在这个过程中我搞砸了,而且我在理解和修复标题中的错误消息方面苦苦挣扎。 这是我的 Vector 类的代码: impor
我正在编写一个程序来打开和读取一个 txt 文件,并在每一行中循环。将第 2 列和第 4 列中的值相乘并将其分配给第 5 列。 A 500.00 A 84.15 ? B 648.80 B 77.61
我知道还有其他几个问题提出了完全相同的问题,但是当我运行时: 导入命令 从 pyDes 导入 * def encrypt(data, password,): k = des(password,
我有一个元组列表,内容如下: >>>myList [(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', '
给定一个 boost::tuple 和 std::tuple,你如何在它们之间进行转换? 也就是说,您将如何实现以下两个功能? template boost::tuple asBoostTuple(
我无法初始化 std::tuple来自 std::tuple 的逐元素元素兼容类型。为什么它不像 boost::tuple 那样工作? #include #include template st
我是 Storm 的新手并且我正在尝试找出如何编写一个 bolt 测试来测试子类 BaseRichBolt 中的 execute(Tuple tuple) 方法。 问题是 Tuple 似乎是不可变的,
如果我有如下元组列表: [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] 我想删除重复的元组(在内容和内部项目顺序方面重复)以便输出为: [('a',
我编写了一个简单的脚本来模拟基于每用户平均收入 (ARPU)、利润率和客户保持客户的年数 (ltvYears) 的客户生命周期值(value) (LTV)。下面是我的脚本。它在“ltvYears =
以下是我的代码,它是一组元组:。输出:设置([(‘A’,20160129,36.44),(‘A’,20160104,41.06),(‘A’,20160201,37.37)])。如何将另一个元组(‘A’
我用以下代码编写了一个程序: import pandas as pd import numpy as np from typing import Tuple def split_data(self,
我是一名优秀的程序员,十分优秀!