小编bal*_*pha的帖子

用Python包装C库:C,Cython还是ctypes?

我想从Python应用程序中调用C库.我不想包装整个API,只包含与我的案例相关的函数和数据类型.在我看来,我有三个选择:

  1. 在C中创建一个实际的扩展模块.可能是矫枉过正,我也想避免学习扩展写作的开销.
  2. 使用Cython将C库中的相关部分公开给Python.
  3. 在Python中完成所有工作,使用ctypes与外部库进行通信.

我不确定2)或3)是否是更好的选择.3)的优点是它ctypes是标准库的一部分,结果代码将是纯Python - 尽管我不确定这个优势实际上有多大.

两种选择都有更多优点/缺点吗?你推荐哪种方法?


编辑:感谢您的所有答案,他们为希望做类似事情的人提供了一个很好的资源.当然,这个决定仍然是针对单个案例做出的 - 没有人"这是正确的事情"的答案.对于我自己的情况,我可能会选择ctypes,但我也期待在其他项目中尝试Cython.

由于没有一个真正的答案,接受一个有点武断; 我选择了FogleBird的答案,因为它提供了对ctypes的一些很好的洞察力,它目前也是最高投票的答案.但是,我建议阅读所有答案以获得良好的概述.

再次感谢.

c python ctypes cython

272
推荐指数
11
解决办法
7万
查看次数

在PyQt应用程序中进行线程化:使用Qt线程还是Python线程?

我正在编写一个GUI应用程序,它定期通过Web连接检索数据.由于此检索需要一段时间,因此会导致UI在检索过程中无响应(无法将其拆分为较小的部分).这就是为什么我想将Web连接外包给一个单独的工作线程.

[是的,我知道,现在我有两个问题.]

无论如何,应用程序使用PyQt4,所以我想知道更好的选择是什么:使用Qt的线程还是使用Python threading模块?每个的优点/缺点是什么?或者你有一个完全不同的建议?

编辑(重新赏金):虽然在我的特定情况下的解决方案可能会使用像Jeff OberLukášLalinský建议的非阻塞网络请求(所以基本上将并发问题留给网络实现),我仍然喜欢更多对一般问题的深入回答:

使用PyQt4(即Qt)线程优于本机Python线程(来自threading模块)的优点和缺点是什么?


编辑2:谢谢大家的答案.虽然没有100%的协议,但似乎普遍认为答案是"使用Qt",因为它的优点是与库的其余部分集成,同时没有造成任何真正的缺点.

对于任何想要在两个线程实现之间进行选择的人,我强烈建议他们阅读这里提供的所有答案,包括abbot链接到的PyQt邮件列表线程.

我考虑了赏金的几个答案; 最后,我选择了abbot作为非常相关的外部参考; 然而,这是一个近距离的电话.

再次感谢.

python multithreading pyqt

107
推荐指数
6
解决办法
4万
查看次数

代码高尔夫:新年的烟花

2009年即将结束,随着经济和所有,我们将节省我们的钱,而不是购买昂贵的烟花,我们将在今年的ASCII艺术庆祝.

挑战

给定一组烟花和时间,在那个时刻拍摄烟花的照片并将其绘制到控制台.

在新年前夜(UTC)午夜之前输入的最佳解决方案将获得500代表的赏金.这是代码高尔夫,因此字符数量很大; 然而,社区投票也是如此,我保留最佳/最酷/最有创意/等等的最终决定.

输入数据

请注意,我们的坐标系是从左到右,从下到上,所以所有的烟花都是在y-coordinate为0(零)时启动的.

输入数据由表单的烟花组成

(x, speed_x, speed_y, launch_time, detonation_time)
Run Code Online (Sandbox Code Playgroud)

哪里

  • x 是烟花发射的位置(列),
  • speed_x并且speed_y是发射时烟花的水平和垂直速度,
  • launch_time 是这个烟花发射的时间点,
  • detonation_time 是这个烟花爆炸的时间点.

烟花数据可以在您的程序中硬编码为5元组(或您的语言中的等效元素)列表,不计入您的字符数.但是,必须很容易更改此数据.

您可以做出以下假设:

  • 有合理数量的烟花(比如少于一百)
  • 对于每个烟花,所有五个数字都是一个合理范围内的整数(比如说,16位就足够了),
  • -20 <= x <= 820
  • -20 <= speed_x <= 20
  • 0 < speed_y <= 20
  • launch_time >= 0
  • launch_time < detonation_time < launch_time + 50

单个附加输入数据是应该呈现的时间点.这是一个非负整数,通过标准输入或命令行参数(无论您选择哪个)给出.

这个想法是(假设您的程序是一个名为python的脚本firework.py),这个bash脚本为您提供了一个漂亮的烟火动画:

#!/bin/bash
I=0
while (( 1 )) ; do
    python firework.py $I
    I=$(( $I + 1 ))
done
Run Code Online (Sandbox Code Playgroud)

(随意把等效的.BAT文件放在这里).

烟花的生活

烟花的生命如下:

  • 在发布时间之前,可以忽略它. …

language-agnostic

63
推荐指数
8
解决办法
4270
查看次数

在Python中重新分类实例

我有一个由外部库提供给我的课程.我已经创建了这个类的子类.我也有一个原始类的实例.

我现在想要将此实例转换为我的子类的实例,而不更改实例已有的任何属性(除了我的子类覆盖的那些属性).

以下解决方案似乎有效.

# This class comes from an external library. I don't (want) to control
# it, and I want to be open to changes that get made to the class
# by the library provider.
class Programmer(object):
    def __init__(self,name):
        self._name = name

    def greet(self):
        print "Hi, my name is %s." % self._name

    def hard_work(self):
        print "The garbage collector will take care of everything."

# This is my subclass.
class C_Programmer(Programmer):
    def __init__(self, *args, **kwargs):
        super(C_Programmer,self).__init__(*args, **kwargs)
        self.learn_C()

    def …
Run Code Online (Sandbox Code Playgroud)

python subclass

56
推荐指数
2
解决办法
9272
查看次数

要求浏览器尽可能积极地进行缓存

这是关于提供图像的Web应用程序.由于相同的请求将始终返回相同的图像,我希望访问的浏览器尽可能积极地缓存图像.我非常想告诉浏览器

这是你的形象.继续保持它; 在接下来的几天里,它真的不会改变.无需再回来.真.我承诺.

到目前为止,我确实做到了

Cache-Control: public, max-age=86400
Last-Modified: (some time ago)
Expires: (two days from now)

当然,304 not modified如果请求具有适当的If-Modified-Since标题,则返回a .

有什么我可以做的(或者我应该采取不同的做法)将我的信息传递给浏览器吗?

该应用程序托管在Google App Engine上,以防万一.

browser caching http http-headers

34
推荐指数
2
解决办法
5956
查看次数

如何获得UIView中像素的颜色?

我正在尝试开发一个小应用程序.在其中,我需要检测UIView中像素的颜色.我有一个CGPoint定义我需要的像素.使用CoreAnimation更改UIView的颜色.

我知道有一些复杂的方法可以从UIImages中提取颜色信息.但是我找不到UIViews的解决方案.

在伪代码我正在寻找类似的东西

pixel = [view getPixelAtPoint:myPoint];
UIColor *mycolor = [pixel getColor];
Run Code Online (Sandbox Code Playgroud)

任何输入都非常感谢.

iphone pixel colors uiview

33
推荐指数
4
解决办法
2万
查看次数

Emacs,自动完成模式,CSS,痛苦.(图示!)

我为Emacs安装了自动完成模式.

第一:当我输入声明时,我得到了正常的自动完成行为:

主持者imgur.com

所以我点击Tab完成 - 没问题.但后来我点击;:

主持者imgur.com

它立刻试图完成一些事情!我不能打,Enter因为那会接受错误的完成!

主持者imgur.com

所以我必须打C-j.太痛苦了.

第二:一旦我完成了声明,我输入}:

主持者imgur.com

...但除非我打字,否则它不会缩进Tab.

是什么赋予了?

更新,设置:

我正在使用Emacs 23.我的css-electric-keys};.我的自动完成配置如下:

(ac-config-default)
(setq ac-auto-start t)
(setq ac-delay 0.1)
(setq ac-auto-show-menu nil)
(setq ac-show-menu-immediately-on-auto-complete t)
(setq ac-trigger-key nil)
Run Code Online (Sandbox Code Playgroud)

css emacs autocomplete

31
推荐指数
1
解决办法
4623
查看次数

在待完成的整理活动消失后,查明当前活动最终是否为任务根

如果FirstActivity是任务的根,并完成自身的推出SecondActivity,然后调用isTaskRoot()SecondActivity立即返回false,因为FirstActivity的整理异步发生,因而还没有完成.等待一秒然后调用isTaskRoot()返回true.

public class FirstActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        finish();
        startActivity(new Intent(this, SecondActivity.class));
    }
}
Run Code Online (Sandbox Code Playgroud)
public class SecondActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        ((TextView)findViewById(R.id.tv1))
                .setText("isTaskRoot() in onResume(): " + isTaskRoot());
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                ((TextView)findViewById(R.id.tv2))
                        .setText("isTaskRoot() after 1s: " + isTaskRoot());
            } …
Run Code Online (Sandbox Code Playgroud)

android android-activity

24
推荐指数
1
解决办法
6861
查看次数

优化程序将忽略筛选的索引条件

假设我正在运行一个显示有趣猫图片的网站.我有一个名为表CatPictures与列Filename,Awesomeness以及DeletionDate和以下指标:

create nonclustered index CatsByAwesomeness
on CatPictures (Awesomeness) 
include (Filename)
where DeletionDate is null
Run Code Online (Sandbox Code Playgroud)

我的主要问题是:

select Filename from CatPictures where DeletionDate is null and Awesomeness > 10
Run Code Online (Sandbox Code Playgroud)

作为一个人,我知道上面的索引是SQL Server所需要的,因为索引过滤条件已经确保了该DeletionDate is null部分.

但是SQL Server不知道这个; 我的查询的执行计划将不使用我的索引:

查询计划,进行表扫描

即使添加索引提示,它仍将DeletionDate通过查看实际的表数据进行显式检查:

查询计划使用索引,但仍然执行书签查找

(并且还抱怨缺少的索引DeletionDate).

我当然可以

include (Filename, DeletionDate)
Run Code Online (Sandbox Code Playgroud)

相反,它会工作:

包含DeletionDate的索引的查询计划;  使用此索引

但是包含该列似乎是浪费,因为这只会占用空间而不添加任何新信息.

有没有办法让SQL Server意识到过滤条件已经在检查工作DeletionDate

indexing sql-server-2008 filtered-index

20
推荐指数
1
解决办法
2702
查看次数

C#中是否有函数类型?

我想知道在C#中是否存在类似于AS3的Function类型.我想做这样的somnthing(但在C#中):

private function doSomething():void {
    // statements
}

var f:Function = doSomething
f()
Run Code Online (Sandbox Code Playgroud)

c# types function

19
推荐指数
4
解决办法
2万
查看次数