Arrays 什么样的数据结构实现了TCL';s阵列?

Arrays 什么样的数据结构实现了TCL';s阵列?,arrays,tcl,Arrays,Tcl,在TCL中处理非常重要的日期,我想知道数组中的搜索速度有多快。不幸的是,数组中的填充过程的性能不如其他著名的脚本语言。下面是一个简单的测试,显示了数组和列表的性能。我的初始测试表明列表的填充速度比数组快。数组在搜索时间上加快了一些速度 array.tcl #!/usr/bin/tclsh set array_time [time { array unset my_array for {set i 0} {$i < 365} {incr i} {

在TCL中处理非常重要的日期,我想知道数组中的搜索速度有多快。不幸的是,数组中的填充过程的性能不如其他著名的脚本语言。

下面是一个简单的测试,显示了数组和列表的性能。我的初始测试表明列表的填充速度比数组快。数组在搜索时间上加快了一些速度

array.tcl

#!/usr/bin/tclsh

set array_time [time {
        array unset my_array
        for {set i 0} {$i < 365} {incr i} {
                set "my_array($i)" $i
        }
        set a [info exists my_array(180)]
        set b [info exists my_array(366)]
} 100]

set list_time [time {
        set my_list [list]
        for {set i 0} { $i < 365} {incr i} {
                lappend my_list $i
        }
        set x [lsearch $my_list 180]
        set y [lsearch $my_list 366]

} 100]

puts "$a, $b"
puts "$x, $y"

puts "array: $array_time

下面是一个简单的测试,它显示了数组和列表的性能。我的初始测试表明列表的填充速度比数组快。数组在搜索时间上加快了一些速度

array.tcl

#!/usr/bin/tclsh

set array_time [time {
        array unset my_array
        for {set i 0} {$i < 365} {incr i} {
                set "my_array($i)" $i
        }
        set a [info exists my_array(180)]
        set b [info exists my_array(366)]
} 100]

set list_time [time {
        set my_list [list]
        for {set i 0} { $i < 365} {incr i} {
                lappend my_list $i
        }
        set x [lsearch $my_list 180]
        set y [lsearch $my_list 366]

} 100]

puts "$a, $b"
puts "$x, $y"

puts "array: $array_time

Tcl称之为“数组”的数据结构是一个从字符串值到变量的关联映射(它被认为是变量,因为它有一个名称,您可以做一些高级的事情,比如给它附加一个
跟踪
)。在后台,它是一个哈希表(事实上,它是所有哈希表中最快的实现之一),因此它可以随着元素数量的增加而很好地扩展

但它与C、Java、C#、Python等语言中的数组不同……Tcl中与之最匹配的是列表,它是一个值(即,无名的、可自动序列化的),保存着从“小”整数(即索引)到值的紧凑映射。它的重量比Tcl阵列轻得多(实际上,它是使用C阵列实现的)

它们不支持同一组操作。事实上,Tcl中还有第三种数据结构需要注意:字典。这是一个从字符串到值的关联映射值。它还使用哈希表实现(使用与Tcl用于数组相同的超快速算法),不过需要进行一些定制,这样就有了固定的迭代顺序(插入顺序,因为在序列化的往返过程中,插入顺序具有良好的属性)

您可以将列表放在词典中,也可以将词典放在列表中。您可以将任意一个元素放入数组元素中。但是您不能将数组(或数组的元素)放入列表或字典中;您所能做的最好的事情就是将数组的名称放入(因为这只是一个普通的旧字符串)


性能比较 列表创建速度最快(尤其是使用
lrepeat
),并且具有快速更新和快速查找操作。如果你是按索引工作的。搜索内容需要线性扫描

数组和字典的创建速度较慢,这取决于您正在做什么,但它们都支持超快速查找和按键更新。(测试是否存在密钥也会进行查找;在算法上几乎与读取相同。)搜索特定有效负载的速度仍然很慢;它仍然需要线性扫描

在Tcl中计时时请注意:始终计时对过程的调用,因为过程比自由代码得到了更充分的优化

proc doStuffList {size value1 value2} {
    for {set i 0} {$i < $size} {incr i} {
        lappend theList $i
    }
    return [list [lindex $theList $value1] [lindex $theList $value2]]
}
proc doStuffDict {size value1 value2} {
    for {set i 0} {$i < $size} {incr i} {
        dict set theDict $i $i
    }
    return [list [dict get $theDict $value1] [dict get $theDict $value2]]
}
proc doStuffArray {size value1 value2} {
    for {set i 0} {$i < $size} {incr i} {
        set theArray($i) $i
    }
    return [list $theArray($value1) $theArray($value2)]
}

puts "lists: [time {doStuffList 500 150 450} 1000]"
puts "dicts: [time {doStuffDict 500 150 450} 1000]"
puts "arrays: [time {doStuffArray 500 150 450} 1000]"
proc doStuffList{size value1 value2}{
对于{set i 0}{$i<$size}{incr i}{
lappend列表$i
}
return[列表[lindex$t列表$value1][lindex$t列表$value2]]
}
proc DOSTUFDICT{size value1 value2}{
对于{set i 0}{$i<$size}{incr i}{
dict设置了dict$i$i
}
return[列表[dict get$theDict$value1][dict get$theDict$value2]]
}
proc DOSTUFARRAY{size value1 value2}{
对于{set i 0}{$i<$size}{incr i}{
设置阵列($i)$i
}
return[列表$theArray($value1)$theArray($value2)]
}
puts“列表:[时间{doStuffList 500 150 450}1000]”
放入“dicts:[时间{dostufdict500 150 450}1000]”
放置“数组:[time{dostufvarray 500 150 450}1000]”
在这台笔记本电脑上,我得到以下输出:

lists: 58.565204 microseconds per iteration dicts: 114.074002 microseconds per iteration arrays: 118.863908 microseconds per iteration 列表:每次迭代58.565204微秒 dicts:每次迭代114.074002微秒 阵列:每次迭代118.863908微秒
但请注意,哪一个是最好的选择完全取决于您所做工作的细节。使用最适合您的算法的数据结构;拟合良好将确保它的性能良好。

Tcl称为“数组”的数据结构是从字符串值到变量的关联映射(它被认为是变量,因为它有一个名称,您可以执行高级操作,例如在其上附加
跟踪。在后台,它是一个哈希表(事实上,它是所有哈希表中最快的实现之一),因此它可以随着元素数量的增加而很好地扩展

但它与C、Java、C#、Python等语言中的数组不同……Tcl中与之最匹配的是列表,它是一个值(即,无名的、可自动序列化的),保存着从“小”整数(即索引)到值的紧凑映射。它的重量比Tcl阵列轻得多(实际上,它是使用C阵列实现的)

它们不支持同一组操作。事实上,Tcl中还有第三种数据结构需要注意:字典。这是一个从字符串到值的关联映射值。它还使用哈希表实现(使用与Tcl用于数组相同的超快速算法),不过需要进行一些定制,这样就有了固定的迭代顺序(插入顺序,因为在序列化的往返过程中,插入顺序具有良好的属性)

您可以将列表放在词典中,也可以将词典放在列表中。您可以将任意一个元素放入数组元素中。但是您不能将数组(或数组的元素)放入列表或字典中;您所能做的最好的事情就是将数组的名称放入(因为这只是一个普通的旧字符串)


性能比较 列表创建速度最快(尤其是使用
lrepeat
),并且具有快速更新和快速查找操作。如果你是按索引工作的。搜索内容需要线性扫描

数组和字典的创建速度较慢-最慢的创建速度取决于您所使用的内容