通过具有相同抽象父类型的对象的集合进行保持/循环的最佳实践(Julia)

寻心者

这是一个初学者的问题,我仍在考虑“在OOP中”,因此,如果我错过手册中的答案或答案很明显,我深表歉意。

假设我们有一个抽象类型,

abstract type My_Abstract_type end

以及属于该类型子代的几种具体结构类型:

mutable struct Concrete_struct1 <: My_Abstract_type end
mutable struct Concrete_struct2 <: My_Abstract_type end
...

假设我们有大量具体类型的对象,并且我们需要存储和遍历这些对象。在Python中,我们可以仅列出对象列表,然后遍历该列表。同样,在C ++中,我们可以创建一个指针数组(类型为My_Abstract_type),并遍历该指针,以多态方式调用所需的所有内容。

但是,我无法在Julia中弄清楚如何做到这一点。我们可以创建一个数组my_array::Array{My_Abstract_type,1},然后遍历它:

for my_object in my_array
    do_something!(my_object)
end

但是,正如此处所讨论的https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-abstract-container-1一样,这会带来巨大的性能损失(在我看来,速度要慢25倍用例)。

一种替代方法是执行以下操作:

my_array1::Array{Concrete_struct1,1}
my_array2::Array{Concrete_struct2,1}
my_array3::Array{Concrete_struct3,1}
...

接着

for my_object in my_array1
    do_something!(my_object)
end
for my_object in my_array2
    do_something!(my_object)
end
for my_object in my_array3
    do_something!(my_object)
end

这给了我们想要的性能,但是显然是糟糕的软件工程实践,尤其是在具有大量具体类型的情况下。我们如何存储和循环遍历朱莉娅这些对象干净不牺牲性能谢谢!

BogumiłKamiński

如果你没有超过四个具体类型那么就使用Union它们,如描述这里的朱莉娅手册。在这种情况下,编译器将为您生成高效的代码。

如果您有很多类型,则可以使用数组数组:

a = [my_array1, my_array2, my_array3]

现在做

foreach(a) do x
    for my_object in x
        do_something!(my_object)
    end
end

现在,a它本身将没有具体的类型,但是对匿名函数的调用应启用代码专用化。这会带来一些开销(的每个元素一个动态调度a),但是假设每个数组中的元素数比类型多,那么它应该是相当快的。

最后,如果您想完全避免动态分配,而要花大量的编译成本,则可以这样编写:

processing_fun() = nothing

function processing_fun(x, xs...)
    for my_object in x
        do_something!(my_object)
    end
    processing_fun(xs...)
end

然后致电:

processing_fun(a...)

(但如果有好处,则必须在您的特定情况下进行基准测试,因为它涉及递归,这也有其成本)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Linq Order通过对具有相同集合的对象进行分组

解决“在ObjectStateManager中已经存在具有相同键的对象”的最佳实践错误

用作具有共享数据的函数集合的类的最佳实践

检查集合是否具有重复值的最佳实践?

通过REPL与阻塞循环进行交互的Python最佳实践

PHP基于对象类型进行操作的最佳实践

编程最佳实践-循环对象

通过具有不同值的相同键对MongoDB集合进行排序

在类中具有多个锁对象的最佳实践

具有抽象工厂的数据访问对象模式,通过泛型类型创建

具有静态工厂的抽象父类的子类的类型

嵌套对象:多个子对象具有相同的父对象

DDD中的域对象集合的最佳实践

如果一个应用程序有多个具有相同字段的模型,那么保持 DRY 的最佳实践是什么?

Swift:对具有相同选择器的对象进行类型转换

Scala:具有相同类的对象具有不同的类型?

具有相同类型的Elastic Search父级

在所有路径中具有相同查询结果的最佳实践

对具有相同名称的行进行分组的最佳方法

JavaScript-通过对象“过滤”-最佳实践?

当序列化具有与该对象相同类型的类成员的对象时,如何解决循环引用

将具有单个对象的数组转换为对象的最佳实践

创建具有相同属性的数据模型的最佳实践

具有相同参数的多个REST API调用的最佳实践是什么

实现具有相同功能的控制器的最佳实践是什么?

在具有相同基础的多个项目上使用git的最佳实践是什么?

如何对具有相同子对象列表的对象进行分组?

用C ++复制具有所有元素的对象!(构造函数和作业,最佳实践?)

如何从具有Impl类类型的父类返回对象?