我已经编写了三个 Python 模块,其中两个是独立的,但最后一个将依赖于两个独立的模块。例如,考虑以下结构
myProject/
subpackage_a/
__init__.py
...
subpackage_b/
__init__.py
...
mainpackage/
__init__.py
...
Run Code Online (Sandbox Code Playgroud)
mainpackage
取决于subpackage_a
and subpackage_b
,其中 assubpackage_a
和subpackage_b
可以独立使用。换句话说,在 中mainpackage
,有对subpackage_a
和 的引用subpackage_b
。简而言之,我希望用户能够from myProject import subpackage_a
在subpackage_a.subfunction(args)
不调用mainpackage
. 我还希望用户使用from myProject import mainpackage
并开始使用mainpackage.mainfucntion(args)
,在那里mainpackage.mainfucntion
将调用subpackage
s 中的函数。
我了解了命名空间打包。但是,我在涉及依赖项的命名空间包上找不到任何内容。如果有更好的解决方案,我不必使用命名空间打包。我能得到一些关于我应该寻找什么的建议吗?
我有一个嵌套的循环迭代方案,占用了大量的内存.我确实理解我不应该使用全局变量,但即使我将所有内容都包含在函数中,内存情况也没有改善.它只是在每次迭代后累积,就像没有垃圾收集一样.
这是一个可行的例子,类似于我的代码.
我有两个文件.首先,functions.jl
:
##functions.jl
module functions
function getMatrix(A)
L = rand(A,A);
return L;
end
function loopOne(A, B)
res = 0;
for i = 1:B
res = inv(getMatrix(A));
end
return(res);
end
end
Run Code Online (Sandbox Code Playgroud)
第二档main.jl
:
##main.jl
include("functions.jl")
function main(C)
res = 0;
A = 50;
B = 30;
for i =1:C
mat = functions.loopOne(A,B);
res = mat .+ 1;
end
return res;
end
main(100)
Run Code Online (Sandbox Code Playgroud)
当我执行时julia main.jl
,内存随着我的扩展C
而增加main(C)
(当我增加到C
1000000 时,有时会增加到数百万个分配和10GiB ).
我知道这个例子看起来没用,但它类似于我的结构.有人可以帮忙吗?谢谢.
更新:
Michael …
我有 MATLAB 背景,所以我倾向于将所有内容矢量化。但是,在 Julia 中,我测试了这两个函数:
function testVec(n)
t = [0 0 0 0];
for i = 1:n
for j = 1:4
t[j] = i;
end
end
end
function testVec2(n)
t = [0 0 0 0];
for i = 1:n
t.= [i i i i];
end
end
@time testVec(10^4)
0.000029 seconds (6 allocations: 288 bytes)
@time testVec2(10^4)
0.000844 seconds (47.96 k allocations: 1.648 MiB)
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
我试图在这里复制内存使用测试.
从本质上讲,帖子声称给出了以下代码片段:
import copy
import memory_profiler
@profile
def function():
x = list(range(1000000)) # allocate a big list
y = copy.deepcopy(x)
del x
return y
if __name__ == "__main__":
function()
Run Code Online (Sandbox Code Playgroud)
调用
python -m memory_profiler memory-profile-me.py
Run Code Online (Sandbox Code Playgroud)
在64位计算机上打印
Filename: memory-profile-me.py
Line # Mem usage Increment Line Contents
================================================
4 @profile
5 9.11 MB 0.00 MB def function():
6 40.05 MB 30.94 MB x = list(range(1000000)) # allocate a big list
7 89.73 MB 49.68 MB y = copy.deepcopy(x)
8 82.10 MB …
Run Code Online (Sandbox Code Playgroud) 在我的代码中,我首先定义了两个lambda函数:
func1 = lambda x: x + 2
func2 = lambda x: x * 2
Run Code Online (Sandbox Code Playgroud)
后来在我的代码中,我想创建一个lambda函数,它添加上面两个lambda函数的结果,但是这个函数必须和上面的函数之一一样.也就是说,我想做这样的事情:
func2 = lambda x: func1(x) + func2(x)
Run Code Online (Sandbox Code Playgroud)
请注意,功能名称func2
再次出现.
我知道这很愚蠢,还有其他方法可以达到同样的预期效果.然而,这个例子只是我试图实现的一个非常简化的版本.但是,这不起作用,因为它给我错误:
RecursionError:超出最大递归深度
我认为这是因为func2
一直在呼唤自己.有没有办法防止这种情况发生?我无法更改名称func1
或func2
(请注意,这也意味着我无法创建两个具有不同名称但内容相同的新功能).我试过这样的事
func2Copy = lambda x: func2(x)
func1Copy = lambda x: func1(x)
func2 = lambda x: func1Copy(x) + func2Copy(x)
Run Code Online (Sandbox Code Playgroud)
但看到了同样的错误(如预期的那样).我正在尝试做什么?
在升级 MacOS 之前,我能够在此处安装 pybind11 示例。但是,在我将 MacOS 升级到 Mojave 后,当我在该链接上编译相同的示例时,我看到以下错误:
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]
ld: library not found for -lstdc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'g++' failed with exit status 1
Run Code Online (Sandbox Code Playgroud)
我缺少链接器命令吗?我在网上搜索过但找不到解决方案。
python ×3
julia ×2
memory ×2
c++ ×1
lambda ×1
macos-mojave ×1
namespaces ×1
package ×1
performance ×1
pybind11 ×1
setuptools ×1