NA
值的存储,但是否可以使用附加的位向量来实现?换句话说,为什么不只使用一种便宜的二位数据结构就足够了呢?值得一提的是,Matlab对逻辑值使用1字节,尽管它不支持NA值。我不确定MathWorks为什么不满足于一位功能,更不用说二位数据结构了,但他们有时候会用花哨的营销策略...[我会在这个问题中利用“两位”最大化价值。;-)]
更新1。我认为提供的架构原因有些道理,但感觉有点事后诸葛亮。
我还没有检查32位或16位R,看看它们的逻辑大小是多少-这可能支持这个想法。
从R内部手册来看,逻辑向量(LGLSXP)和整数(INTSXP)在每个平台上都是32位。我可以理解一个独立于字长的整数通用大小。同样,逻辑存储似乎也与字长无关。但是它太大了。 :)
此外,如果字长参数如此强大,那么对我来说看到Matlab(我认为它是32位Matlab)只使用1个字节似乎很奇怪 - 我想知道MathWorks是否选择更节省内存的编程复杂性和一些其他开销来找到子字对象的权衡。
此外,还有其他选择可供选择:如Brian Diggs所指出的,bit
包可以使位向量变得更加容易,这对于上面问题中的问题非常有用(通过从4字节的logical
值转换为位向量,任务的速度提高了8-10倍)。尽管访问内存的速度很重要,但移动30-31个额外的无信息位(从信息理论的角度来看)是浪费的。例如,可以使用像在这里描述整数使用的内存技巧 - 获取一堆额外的内存(V单元),然后在位级别处理事物(类似于bit()
)。为什么不这样做并为长向量保存30位(1个值,1个NA
)?就我受布尔影响的RAM和计算速度而言,我打算切换到使用
bit
,但这是因为在某些情况下,空间节省达到了97%。 :)我认为这个问题的答案将来自于对R设计或内部的更深入了解的人。最好的例子是Matlab使用不同大小的逻辑,内存字大小在那种情况下不会是答案。Python可能与R类似。
另一种相关的表述方式可能是:为什么在所有平台上都是4个字节?(CHARSXP
通常较小,这样做行不行?为什么不更小,只是超额分配?)(更新:使用CHARSXP
的想法可能是虚假的,因为对CHARSXP
的操作不如整数那么有用,例如sum
。使用与字符相同的数据结构可能会节省空间,但会限制可以对其进行操作的现有方法。更合适的考虑是使用更小的整数,如下所讨论的。)
更新2. 这里有一些非常好的、启发性的答案,特别是在如何实现检索和处理布尔值以提高速度和编程效率方面。我认为Tommy的答案尤其可信,因为它似乎源于两个前提,这就解释了为什么在R中会出现这种情况:
为了支持逻辑向量的加法(注意,“逻辑”是由编程语言/环境定义的,与布尔值不同),最好重用添加整数的代码。在R的情况下,整数占用4个字节。在Matlab的情况下,最小的整数是1个字节(即
int8
)。这解释了为什么为逻辑变量编写不同的内容会很麻烦。[对于不熟悉R的人,它支持许多逻辑运算,例如sum(myVector)
,mean(myVector)
等。]遗留支持使得做一些与R和S-Plus长期以来所做的不同的事情变得非常困难。此外,我怀疑在S、S-Plus和R的早期,如果有人需要大量进行布尔运算,他们会使用C语言而不是尝试在R中使用逻辑运算。
感谢所有人提供非常全面的答案和见解。