Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建索引不可知的2元组?_Python_Tuples_Memoization - Fatal编程技术网

Python 如何创建索引不可知的2元组?

Python 如何创建索引不可知的2元组?,python,tuples,memoization,Python,Tuples,Memoization,我正在实现一个带有2个参数的函数,并缓存结果以提高性能(“记忆”技术)。但我在缓存功能中看到了重复。例如: @memoize def fn(a,b): #do something. 问题是,我事先知道fn(a,b)==fn(b,a),因此我希望它理解,在这种情况下,参数元组(a,b)相当于(b,a),但该函数目前将它们作为两个单独的条目进行缓存 我需要为这个目的建立一个新的类,还是有其他更优雅的方式?虽然我知道我可以为两个元组缓存相同的函数返回值,但我真的想知道如何实现“索引不可知”元

我正在实现一个带有2个参数的函数,并缓存结果以提高性能(“记忆”技术)。但我在缓存功能中看到了重复。例如:

@memoize
def fn(a,b):
    #do something.
问题是,我事先知道
fn(a,b)==fn(b,a)
,因此我希望它理解,在这种情况下,参数元组
(a,b)
相当于
(b,a)
,但该函数目前将它们作为两个单独的条目进行缓存

我需要为这个目的建立一个新的类,还是有其他更优雅的方式?虽然我知道我可以为两个元组缓存相同的函数返回值,但我真的想知道如何实现“索引不可知”元组


这个记忆代码只是一个例子,我希望我的tuple对象是非常通用的,也可以在其他情况下使用

如果您想要一个非常通用的解决方案,不仅针对两个参数,而且可能针对多个参数,其中
(a,b,a)
(a,a,b)
处理相同,但与
(a,b,b)
不同,您可以使用
冻结集(计数器(参数组).items()
计算每个值的出现次数,并将结果dict转换为元组的固定集(在集合导入计数器的
之后)。

您可以将其拆分为两个函数。public函数以任意顺序接受参数,并使用排序后的参数调用内部函数。内部函数是带有缓存的函数

def fn(*args):
    return cached_fn(*sorted(args))

@memoize
def cached_fn(*args)
    # do something
这是一种时空权衡——为了将缓存的大小减半,需要进行一些额外的函数调用。希望您没有具有非常长的参数列表的函数,因此排序不应该增加太多开销


此解决方案要求参数的数据类型具有比较函数,以便对其进行排序。如果没有这样的前提条件,我想不出一个通用的方法来写这篇文章。在处理某些类型时,您可以设计一个自定义方法来规范化顺序。或者您可以在缓存中使用自己的哈希函数,并使其顺序不可知。

一个简单的解决方案是使用
排序(参数\u元组)
冻结集(参数\u元组)
作为缓存键。或者
元组(排序(参数\u元组))
除非您想使其非常通用,否则可以针对
(A,b)进行缓存
(b,a)
同时进行。因此,当调用例如
fn(1,2)
时,您只需调用一次函数,在调用
fn(2,1)
时,您还可以预缓存。@jornsharpe我非常希望它是非常通用的,这个备忘录只是我脑海中的一个例子。
@memoize
装饰是否允许您指定如何计算缓存密钥?谢谢,但我如何使其成为通用的,而不是特定于这种情况。就像@blhsing回答的那样,但可能更简单一点??我已经概括了可视函数,你是说
*排序(args)
?元组没有这种方法。请记住,只有在参数列表中的对象是可排序/可比较的情况下,这种方法才有效,因此,如果OP希望这样做的话,它可能不是通用的。还请记住,排序在时间复杂度上比计数要高,不过除非参数列表的长度很长,否则排序不会有多大影响。@blhsing你明白我的意思了吧,兄弟。这正是我想问的。