我在这里读了一篇关于Stack Overflow的评论,在更改列表时进行切片分配的内存效率更高.例如,
a[:] = [i + 6 for i in a]
Run Code Online (Sandbox Code Playgroud)
应该比内存更有效
a = [i + 6 for i in a]
Run Code Online (Sandbox Code Playgroud)
因为前者替换现有列表中的元素,而后者创建一个新列表并重新绑定a到该新列表,将旧内容留a在内存中,直到它可以被垃圾收集.对速度进行基准测试,后者稍快一些:
$ python -mtimeit -s 'a = [1, 2, 3]' 'a[:] = [i + 6 for i in a]'
1000000 loops, best of 3: 1.53 usec per loop
$ python -mtimeit -s 'a = [1, 2, 3]' 'a = [i + 6 for i in a]'
1000000 loops, best of 3: 1.37 usec per loop …Run Code Online (Sandbox Code Playgroud) 我正在尝试从CGI脚本启动后台进程.基本上,当提交表单时,CGI脚本将向用户指示正在处理他或她的请求,而后台脚本执行实际处理(因为处理往往需要很长时间.)我面临的问题是Apache在子脚本终止之前不会将父CGI脚本的输出发送到浏览器.
一位同事告诉我,我想做的事情是不可能的,因为没有办法阻止Apache等待CGI脚本的整个进程树死掉.但是,我也看到网上有很多引用"双叉"技巧,这个技巧应该可以完成.这个技巧在Stack Overflow的回答中简洁地描述,但我在其他地方看到了类似的代码.
这是我编写的用于测试Python中的双叉技巧的简短脚本:
import os
import sys
if os.fork():
print 'Content-type: text/html\n\n Done'
sys.exit(0)
if os.fork():
os.setsid()
sys.exit(0)
# Second child
os.chdir("/")
sys.stdout.close()
sys.stderr.close()
sys.stdin.close()
f = open('/tmp/lol.txt', 'w')
while 1:
f.write('test\n')
Run Code Online (Sandbox Code Playgroud)
如果我从shell运行它,它完全符合我的期望:原始脚本和第一个后代死亡,第二个后代继续运行,直到它被手动杀死.但是如果我通过CGI访问它,那么在我杀死第二个后代之后页面将不会加载,或者由于CGI超时而Apache杀死它.我也尝试替换第二sys.exit(0)带os._exit(0),但没有任何区别.
我究竟做错了什么?
我正在开发一个使用许多开源第三方库的Python应用程序.其中一个库是基于的ctypes,我最近在其中发现了10多个单独的内存泄漏.这些泄漏的原因包括对具有显式析构函数的对象的循环引用(Python不能垃圾收集),c_char_p以及作为返回非const字符数组的函数的返回类型(导致字符数组自动转换为Python字符串和原始的C分配数组永远不会被释放.)
我修复了我找到的泄漏并向库的作者提交了拉取请求.通过在循环中创建和删除对象并观察Python的内存使用情况,我做了一些非正式的测试,我认为我已经找到了所有泄漏.但是,由于我打算在我想开源的应用程序中使用这个库,并希望有其他一些人使用,我想比这更确定.所以我的问题是:是否有一种系统的方法来查找ctypes基于库的内存泄漏?
在修复我已经找到的泄漏的过程中,我尝试了Heapy和objgraph但是对于这个目的都没有特别有用.据我所知,它们都只显示在Python堆上分配的对象,因此它们对于查找由C库分配的堆空间处理不当引起的泄漏没有用处.我可以在Python中使用哪种工具可以显示C堆上的分配,最好还有哪些Python对象(如果有的话)引用分配的地址?
我参加了大学的编译课程,虽然也做了很多工作,但它非常有用,而且非常有趣.由于我们有一个语言规范要实现,我没有学到很多东西的是语言设计.我现在正在考虑创造一种简单的玩具语言,这样我就可以玩游戏并尝试不同的语言设计原则.
我还没有决定的一件事是我希望我的编译器输出什么语言或格式.理想情况下,我想输出一个易于使用的虚拟机的字节码,并且还具有一些调试功能(例如,能够在任何时候暂停执行并查看堆栈.)我没有找到一个触发的但是,我很喜欢.为了让您了解我正在寻找的东西,以下是我考虑过的一些选项,以及我看到它们的优点和缺点:
我可以输出文本x86汇编语言,然后调用像NASM或FASM这样的汇编程序.这将为我提供一些编译实际硬件的经验,因为我以前的编译器工作是在VM上完成的.我可以使用gdb调试生成的程序,尽管它可能不如使用具有调试支持的VM那么容易.这方面的主要缺点是我对x86汇编的经验有限,而作为CISC指令集,它有点令人生畏.
我可以为像JVM或Lua虚拟机这样的流行虚拟机输出字节码.这些的优点和缺点可能会根据我选择的特定VM而有所不同,但总的来说,我在这里看到的缺点是可能需要学习字节码,这可能对我未来的项目的适用性有限.我也不确定哪种VM最适合我的需求.
我可以使用我的编译器课程中使用的相同VM,这是专门为此目的在我的大学设计的.我已经熟悉它的设计和指令集,它具有不错的调试功能,所以这是一个巨大的优势.然而,它的能力非常有限,我觉得如果我尝试做任何事情,即使是适度进步,我也会很快遇到这些限制.
我可以使用LLVM并输出LLVM中间表示. LLVM IR看起来非常强大,熟悉它对我来说绝对有用.另一方面,我真的不知道使用和调试是多么容易,所以我非常感谢在该领域有经验的人的建议.
我可以设计和实现自己的虚拟机. 这有一个巨大而明显的缺点:我基本上将我的项目转变为两个项目,大大降低了我实际完成任务的可能性.但是,它仍然有点吸引人,因为它允许我创建一个对我想要的语言功能具有"一流"支持的VM - 例如,Lua VM拥有对表的一流支持,这使得它很容易在Lua字节码中使用它们.
总而言之,我正在寻找一个我可以定位的VM或汇编程序,它相对容易学习和使用,并且易于调试.由于这是一个爱好项目,理想情况下我也希望尽量减少花费大量时间学习一些我永远不会再使用的工具或语言的机会.我希望从这个练习中获得的主要内容是对语言设计复杂性的第一手理解,所以任何有助于相对快速实现的东西都会很棒.
compiler-construction assembly language-design vm-implementation
我的一个朋友在NSDictionary中发现了一些奇怪的行为,我很好奇它为什么会发生.请考虑以下代码:
NSDictionary *dict = [[NSDictionary alloc] init];
// Oops, we can't mutate an NSDictionary
[dict setObject:[[NSNull alloc] init] forKey:@"test"];
NSLog(@"Set");
Run Code Online (Sandbox Code Playgroud)
代码在编译时会产生警告"'NSDictionary'可能不响应'setObject:forKey:'".这一切都很好,如果你还是运行它,你将在控制台中得到这个输出:
- [__ NSCFDictionary setObject:forKey:]:将mutating方法发送到不可变对象
再次,正是你期望发生的事情.但是,此时应用程序不会因未捕获的异常而崩溃或终止.setObject:forKey:方法根本不会返回,应用程序似乎挂起; 以下NSLog内容从未执行过.如果您尝试使用GDB跳过或进入该方法,调试似乎结束,但没有任何明确的错误消息.该应用程序继续运行,但调试器没有提供代码中执行"卡住"的位置的线索.
这里发生了什么?在这种情况下,应用程序实际上做了什么,为什么它不会因为NSInternalInconsistencyException或类似的东西而崩溃?
编辑:对于那些曾经问过的人,我在OS X Lion(10.7.2)上运行XCode 4.1,使用"Apple LLVM编译器2.1"构建.我正在使用XCode 4中新的Cocoa项目获得的所有默认设置.无论是调试程序还是"运行",我都会遇到相同的非崩溃行为.从Debug构建更改为Release构建没有任何区别.我甚至可以在Finder中手动找到.app文件并双击它以在XCode之外执行它,它仍然不会崩溃.
我正在尝试使用OpenCV来做一些基本的增强现实.我正在采用的方法是findChessboardCorners从相机图像中获取一组点.然后,我沿着z = 0平面创建一个3D四边形,并用于solvePnP在成像点和平面点之间获得单应性.从那以后,我想我应该能够设置一个模型视图矩阵,这将允许我在图像顶部渲染一个具有正确姿势的立方体.
所述文档为solvePnP说,它输出一个旋转矢量"即(连同[平移向量])带来从模型点坐标系统到摄像机坐标系统".我认为这与我想要的相反; 由于我的四边形在z = 0的平面上,我想要一个模型视图矩阵,它将该四边形转换为适当的3D平面.
我认为通过以相反的顺序执行相反的旋转和平移,我可以计算出正确的模型视图矩阵,但这似乎不起作用.虽然渲染的对象(立方体)确实随着摄像机图像一起移动,并且看起来在翻译时大致正确,但旋转根本不起作用; 当它应该仅在一个轴上旋转时,它在多个轴上,有时在错误的方向上旋转.这是我到目前为止所做的事情:
std::vector<Point2f> corners;
bool found = findChessboardCorners(*_imageBuffer, cv::Size(5,4), corners,
CV_CALIB_CB_FILTER_QUADS |
CV_CALIB_CB_FAST_CHECK);
if(found)
{
drawChessboardCorners(*_imageBuffer, cv::Size(6, 5), corners, found);
std::vector<double> distortionCoefficients(5); // camera distortion
distortionCoefficients[0] = 0.070969;
distortionCoefficients[1] = 0.777647;
distortionCoefficients[2] = -0.009131;
distortionCoefficients[3] = -0.013867;
distortionCoefficients[4] = -5.141519;
// Since the image was resized, we need to scale the found corner points
float sw = _width / SMALL_WIDTH;
float sh = _height / …Run Code Online (Sandbox Code Playgroud) 我想JSONRepresentation在一个NSMutableDictionary对象上调用该方法.我正在使用它[userDict JSONRepresentation];,但我收到以下警告:
NSMutableDictionary may not responsd to '-JSONRepresentation'
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何JSONRepresentation在NSMutableDictionary类型的对象上正确调用该方法?
提前致谢.
对于学校项目,我使用Lua为游戏引擎添加一些脚本功能.引擎加载速度很慢,因此每次更改我的一个Lua脚本时都不必重新启动它,我希望能够重新加载脚本.我希望能够以安全可靠的方式做到这一点,即使其他剧本作者以不可预测的方式污染了全球状态.
在我看来,最简单的方法是简单地销毁lua_State我的C++代码,然后创建一个新代码,重新绑定我的函数并重新加载所有必需的脚本.但是,我在使其正常工作时遇到了一些麻烦.我有一个类作为Lua虚拟机的接口,它具有以下构造函数和析构函数:
LuaInterface::LuaInterface()
{
luaVM = lua_open();
luaL_openlibs(luaVM);
// Create the ortsgfx table.
lua_newtable(luaVM);
lua_setglobal(luaVM, TABLE_NAME);
}
LuaInterface::~LuaInterface()
{
// Close the Lua virtual machine
lua_close(luaVM);
}
Run Code Online (Sandbox Code Playgroud)
请注意,当对象的析构函数执行时,将调用lua_close(luaVM).我尝试使用以下代码从游戏引擎重置Lua:
lua.~LuaInterface();
lua = LuaInterface();
initLua();
Run Code Online (Sandbox Code Playgroud)
(当然,Lua是LuaInterface对象.)initLua()当我尝试初始化其中一个表时,这会导致分段错误. 但是,如果我lua_close(luaVM)在析构函数中删除调用,那么一切正常.
我究竟做错了什么?另外,还有更好的方法来重新加载我的Lua脚本吗?
python ×3
apache ×1
assembly ×1
benchmarking ×1
c++ ×1
cgi ×1
ctypes ×1
fork ×1
hang ×1
ios ×1
iphone ×1
json ×1
lua ×1
memory-leaks ×1
objective-c ×1
opencv ×1
opengl-es ×1
performance ×1