我的一个项目中有一个情况,我可以使用列表或字典,我很难选择使用哪一个.
我正在分析大量的项目(> 400k).我会有(> 400k)列表或词典,我将经常使用.(获取/设置/更新)
在我的特殊情况下,如果我根本不考虑性能,使用字典感觉比列表更方便.但是,我知道我可以管理使用列表编写相同的东西.
我是否应该寻求可读性并使用字典或使用字典可能会增加太多的开销,这会从内存和时间的角度大大降低我的性能.
我知道这个问题有点过于宽泛.但是在完成这个决定之后我开始构建我的所有逻辑之前我想问它.
我的情况简而言之:
我有钥匙的价值0,1,...,n.现在,密钥将始终从整数0到n,我可以保持在列表中.
但是,我可以想到将来可能出现的一些情况,我需要保留一些不是整数的键的项目.或者不是连续的整数.
所以,问题是如果首先使用字典而不是列表不会增加大量的内存/时间成本,我将首先使用字典.但是,我不确定有> 400k字典与> 400k列表在性能方面有很大差异.
所以我是一个长期的perl脚本编写者,因为几个月前我换了工作,所以我已经习惯了python.通常在perl中,如果我有一个值列表,我需要检查一个变量(只是为了查看列表中是否有匹配),我发现更容易生成哈希来检查,而不是将值放入一个数组,如下:
$checklist{'val1'} = undef;
$checklist{'val2'} = undef;
...
if (exists $checklist{$value_to_check}) { ... }
Run Code Online (Sandbox Code Playgroud)
显然,由于需要无用的右手值,这会浪费一些内存,但IMO比循环数组更有效,更容易编码.
现在在python中,无论你是在搜索列表还是字典,它的代码都是完全相同的:
if value_to_check in checklist_which_can_be_list_or_dict:
<code>
Run Code Online (Sandbox Code Playgroud)
所以我真正的问题是:在perl中,哈希方法更适合处理速度而不是迭代数组,但这在python中是否正确?鉴于代码是相同的,我想知道python是否更好地列出迭代?我还应该将字典方法用于更大的列表吗?
我有以下代码,它将输入字符串转换为莫尔斯代码.我的代码遍历字符串中的每个字母,然后遍历字母表中的每个字符.这是非常低效的,因为如果我从一个非常大的文件中读取,而不是一个小的字母串.有什么方法可以改进我的代码,也许使用模块re,将我的字符串与莫尔斯代码字符匹配?
morse_alphabet = ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.."
ALPHABET = "abcdefghijklmnopqrstuvwxyz"
morse_letters = morse_alphabet.split(" ")
result = []
count_character = 0
def t(code):
for character in code:
count_letter = 0
for letter in ALPHABET:
lower_character = code[count_character].lower()
lower_letter = letter.lower()
if lower_character == lower_letter:
result.append(morse_letters[count_letter])
count_letter += 1
count_character += 1
return result
Run Code Online (Sandbox Code Playgroud) 有人知道python的字典'get(key)'方法的O(?)是什么?
我已经使用cProfile模块对其进行了测试,并获得了字典中100,1000,10000,100000,1000000,100000000条记录的相同时间结果.
这是否意味着python的字典为任何密钥提供O(1)访问时间?
我想循环一个大的二维列表:
authors = [["Bob", "Lisa"], ["Alice", "Bob"], ["Molly", "Jim"], ... ]
Run Code Online (Sandbox Code Playgroud)
并获取一个列表,其中包含作者中出现的所有名称.
当我遍历列表时,我需要一个容器来存储我已经看过的名字,我想知道我是否应该使用列表或字典:
列表:
seen = []
for author_list in authors:
for author in author_list:
if not author in seen:
seen.append(author)
result = seen
Run Code Online (Sandbox Code Playgroud)
用词典:
seen = {}
for author_list in authors:
for author in author_list:
if not author in seen:
seen[author] = True
result = seen.keys()
Run Code Online (Sandbox Code Playgroud)
哪一个更快?还是有更好的解决方案?
我正在努力将一些excel工作表转移到python自动化,并且遇到了速度问题.
我有一个列表,其中包含大约10,000个列表,每个列表包含20个左右的列.我还有一个帐号列表(100.000个数字)
我希望迭代我的列表列表,然后从列表中选择值,如果列表中的帐号与帐户列表中的帐号匹配.
通过运行此代码,我可以得到我想要的结果,但是它很慢.
calc = 0
for row in listOfLists:
if row[1] in Accounts:
calc += row[8]
Run Code Online (Sandbox Code Playgroud)
关于如何优化速度的任何想法?
我最近询问了创建 10 的幂的最快方法,结果发现最快的方法实际上是一种偷偷摸摸的解决方法,您首先创建所有可能的值,然后在需要时简单地查找它们。
在解决方案中,alist被用作查找表,但是,我刚刚了解到,在查找操作方面dicts 应该要快得多(另请参见此处)。但是当我尝试使用 adict作为查找表时,过程实际上更慢:
n = 200
18 ns 18 ns 18 ns f[n] # list
22 ns 22 ns 22 ns g[n] # dict
n = -200
18 ns 18 ns 18 ns f[n] # list
29 ns 29 ns 29 ns g[n] # dict
Run Code Online (Sandbox Code Playgroud)
这是为什么?这是否与它们是keys整数而不是字符串有关?(而且我猜sets在这种情况下不能使用?)
这是我运行的代码:
from timeit import repeat
solutions = [
'f[n] # list',
'g[n] # dict', …Run Code Online (Sandbox Code Playgroud) python ×7
loops ×2
python-2.7 ×2
dictionary ×1
list ×1
lookup ×1
optimization ×1
performance ×1