当前位置: 首页 > 面试题库 >

设置与冻结设置性能

苏乐童
2023-03-14
问题内容

我在修改Pythonsetfrozenset集合类型。

最初,我认为frozenset它将提供比更好的查找性能set,因为它是不变的,因此可以利用存储项目的结构。

但是,对于以下实验,情况似乎并非如此:

import random
import time
import sys

def main(n):
    numbers = []
    for _ in xrange(n):
        numbers.append(random.randint(0, sys.maxint))
    set_ = set(numbers)
    frozenset_ = frozenset(set_)

    start = time.time()
    for number in numbers:
        number in set_
    set_duration = time.time() - start

    start = time.time()
    for number in numbers:
        number in frozenset_
    frozenset_duration = time.time() - start

    print "set      : %.3f" % set_duration
    print "frozenset: %.3f" % frozenset_duration


if __name__ == "__main__":
    n = int(sys.argv[1])
    main(n)

我使用CPython和PyPy执行了此代码,结果如下:

> pypy set.py 100000000
set      : 6.156
frozenset: 6.166

> python set.py 100000000
set      : 16.824
frozenset: 17.248

frozenset在CPython和PyPy中,查找性能似乎实际上要慢一些。有人知道为什么会这样吗?我没有研究实现。


问题答案:

frozensetset实现在很大程度上共享; aset只是一个frozenset添加了变异方法的a
,具有完全相同的哈希表实现。参见Objects/setobject.c文件;
顶级PyFrozenSet_Type高清股与功能的PySet_Type定义。

这里没有针对冻结集的优化,因为 frozenset测试成员资格时无需计算项目 的哈希值。用于
集合进行测试的项目仍需要计算其哈希值,以便在集合哈希表中找到正确的插槽,以便进行相等性测试。

因此,您的计时结果可能由于系统上正在运行其他进程而无法使用。您测量了时钟时间,没有禁用Python垃圾收集,也没有重复测试同一件事。

尝试使用timeit模块运行测试,其中一个来自numbers,一个不在集合中:

import random
import sys
import timeit

numbers = [random.randrange(sys.maxsize) for _ in range(10000)]
set_ = set(numbers)
fset = frozenset(numbers)
present = random.choice(numbers)
notpresent = -1
test = 'present in s; notpresent in s'

settime = timeit.timeit(
    test,
    'from __main__ import set_ as s, present, notpresent')
fsettime = timeit.timeit(
    test,
    'from __main__ import fset as s, present, notpresent')

print('set      : {:.3f} seconds'.format(settime))
print('frozenset: {:.3f} seconds'.format(fsettime))

这将每个测试重复一百万次,并产生:

set      : 0.050 seconds
frozenset: 0.050 seconds


 类似资料:
  • pre { white-space: pre-wrap; } 本实例演示如何冻结一些列,当用户在网格上移动水平滚动条时,冻结列不能滚动到视图的外部。 为了冻结列,您需要定义 frozenColumns 属性。frozenColumn 属性和 columns 属性一样。     $('#tt').datagrid({         title:'Frozen Columns',         

  • 有两个命令使用得最多了,从第一次调用 Git 到每天的日常微调及参考,这个两个命令就是: config 和 help 命令。 git config Git 做的很多工作都有一个默认方式。 对于绝大多数工作而言,你可以改变 Git 的默认方式,或者根据你的偏好来设置。 这些设置涵盖了所有的事,从告诉 Git 你的名字,到指定偏好的终端颜色,以及你使用的编辑器。 此命令会从几个特定的配置文件中读取和写

  • 我在Ruby on Rails应用程序上的Devise遇到了一个奇怪的错误。当进入默认的注册表单时,在输入电子邮件和密码字段然后按下注册后,按钮变得不可点击,然后什么也没发生。 以前的用户已经通过这种方法成功注册,所以我可以确认它以前的工作。从那以后,我已经好几个月没有注册任何新用户了。 Heroku日志不显示任何活动,除了获取注册页面。 2016-10-12T13:34:23.799746 00

  • 问题内容: 当您想使用Javascript更改HTML时,如何知道何时使用以下任一方法? 问题答案: 设置通常用于输入/表单元素。通常用于div,span,td和类似元素。

  • 若要配置安全性设置,请前往“配置”->“安全性”。 你可以更改用户密码的复杂性要求以提高密码强度,以及强制注销所有其他用户会话。 如果要在 Navicat Monitor 和客户端之间使用加密连接(HTTPS 会话),你可以将 Navicat Monitor 配置为使用 SSL/TLS 协议。请点击“+ 添加证书”并配置以下信息: 名 輸入证书的名。 证书 粘贴证书文件的内容。 私钥 粘贴私钥文件

  • 主要内容:Jsoup 设置属性 语法,Jsoup 设置属性 说明,Jsoup 设置属性 示例以下示例将展示在将 HTML 字符串解析为 Document 对象后使用方法设置 dom 元素的属性、批量更新和添加/删除类方法。 Jsoup 设置属性 语法 document : 文档对象代表 HTML DOM。 Jsoup : 解析给定 HTML 字符串的主类。 html : HTML 字符串。 link : 元素对象表示表示锚标记的 html 节点元素。 link.attr() : attr