【问题标题】:High-performance Python collections in PharoPharo 中的高性能 Python 集合
【发布时间】:2018-07-19 04:57:47
【问题描述】:

我尽量避免在这里重新发明轮子。我想确认哪些高性能 python 集合是 Pharo 中最接近的:

计数器就是袋子

保持元素插入顺序的字典:

  • Python:OrderedDict
  • Pharo:OrderedDictionary(在官方图片中找到)

默认字典是创建您尝试访问的任何项目的字典

(defaultdict 可用于使用多个键创建树):

d[key1][key2][key3] = value

双端队列(Deque):支持从任一端添加和删除元素

我的假设是否正确? 是否有另一个 Collection 子类可以更好地替代上述情况?

【问题讨论】:

  • 答案是肯定的,你的假设是正确的。另请注意,Pharo 6.1 中有一个 OrderedDictionary 类。
  • @LeandroCaniglia 请作为答案发布
  • @dcorking 感谢您鼓励我发布答案。

标签: python dictionary collections smalltalk pharo


【解决方案1】:

这个问题有两个不同的答案。一个简短,另一个更详细。

简短的回答是肯定的,你的假设是正确的,CountBagOrderedDictOrderedDictionary,等等。

一个更详细的答案应该至少包括一些例子。

Bag

这是一个跟踪重复的无序集合(又名occurrences

bag := Bag new.
bag add: 'Hello'; add: 3; add: 'Hello'.
self
  assert: (bag occurrencesOf: 'Hello') = 2;
  assert: (bag occurrencesOf: 3) = 1;
  assert: (bag occurrencesOf: 'foo') = 0

不熟悉Bag 的人倾向于使用Dictionary 来计算重复次数。没必要,Bags就是这样实现的,所以不需要重新实现这些集合。

注意BagSet 之间的区别。虽然两者都是无序的,但后者将只保留同一实例的一个条目:

set := Set new.
set add: 3; add: 3.
set asArray = #(3)

同时

bag := Bag new.
bag add: 3; add: 3.
bag asArray = #(3 3)

有序字典

DictionaryOrderedDictionary 的区别在于前者是无序的,而后者记住加法的顺序。因此,它们的行为也与OrderedCollections 一样,除了在这种情况下,键是隐式索引12 等(请记住,索引始终是1-基于 Smalltalk。)我们为拥有这两个功能(通用密钥和排序)付出的代价主要是 values 集合的重复。但请注意,实现这些对象有不同的选择。

dictionary := OrderedDictionary new.
dictionary
   at: 'c' put: 'CC';
   at: 'b' put: 'BB';
   at: 'a' put: 'AA'.
dictionary asArray = #('CC' 'BB' 'AA')

然而

dictionary := Dictionary new.
dictionary
   at: 'c' put: 'CC';
   at: 'b' put: 'BB';
   at: 'a' put: 'AA'.
dictionary asArray = #('AA' 'BB' 'CC')

基本上是因为'a' hash < 'b' hash < 'c' hash,因此很容易预见到值的内部分配。

【讨论】:

    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多