小编cbe*_*zan的帖子

python的设计:为什么断言声明而不是函数?

在Python中,assert是一个语句,而不是一个函数.这是一个刻意的决定吗?assert成为一个声明(和保留字)而不是一个函数有什么好处吗?

根据 文件,assert expression1, expression2扩大到

if __debug__:
    if not expression1: raise AssertionError(expression2)
Run Code Online (Sandbox Code Playgroud)

文档还说"当编译时请求优化时,当前代码生成器不会为assert语句发出代码." 在不知道细节的情况下,似乎需要一个特殊情况才能实现这一目标.但是,一个特殊情况也可用于优化对assert()函数的调用.

如果assert是一个函数,你可以写:

assert(some_long_condition,
       "explanation")
Run Code Online (Sandbox Code Playgroud)

但因为assert是一个声明,元组总是评估True,你得到

SyntaxWarning: assertion is always true, perhaps remove parentheses?
Run Code Online (Sandbox Code Playgroud)

写它的正确方法是

assert some_long_condition, \
       "explanation"
Run Code Online (Sandbox Code Playgroud)

这可能不那么漂亮了.

python assert language-design

54
推荐指数
4
解决办法
4049
查看次数

django:预取GenericForeignKey的相关对象

假设我有一个模型,Box一个GenericForeignKey指向任何一个Apple实例或Chocolate实例.AppleChocolate反过来,有ForeignKeys来FarmFactory,分别.我想显示一个Boxes 列表,我需要访问FarmFactory.如何在尽可能少的数据库查询中执行此操作?

最小的说明性示例:

class Farm(Model):
    ...

class Apple(Model):
    farm = ForeignKey(Farm)
    ...

class Factory(Model):
    ...

class Chocolate(Model):
    factory = ForeignKey(Factory)
    ...

class Box(Model)
    content_type = ForeignKey(ContentType)
    object_id = PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    ...

    def __unicode__(self):
        if self.content_type == ContentType.objects.get_for_model(Apple):
            apple = self.content_object
            return "Apple {} from Farm {}".format(apple, apple.farm)
        elif self.content_type == ContentType.objects.get_for_model(Chocolate):
            chocolate = self.content_object
            return …
Run Code Online (Sandbox Code Playgroud)

django optimization foreign-keys generic-foreign-key

16
推荐指数
1
解决办法
5471
查看次数

有效地找到匹配位掩码的第一个元素

我有一个N 64位整数列表,其位代表小集.每个整数最多有k位设置为1.给定位掩码,我想找到列表中与掩码匹配的第一个元素,即element & mask == element.

例:

如果我的列表是:

index abcdef
  0   001100
  1   001010
  2   001000
  3   000100
  4   000010
  5   000001
  6   010000
  7   100000
  8   000000
Run Code Online (Sandbox Code Playgroud)

而我的掩码是111000,与掩码匹配的第一个元素是索引2.

方法1:

线性搜索整个列表.这需要O(N)时间和O(1)空间.

方法2:

预先计算所有可能掩码的树,并在每个节点保留该掩码的答案.这需要O(1)时间进行查询,但需要O(2 ^ 64)空间.

题:

如何在比O(N)更快的时间内找到与掩模匹配的第一个元素,同时仍然使用合理的空间量?我可以在预计算中花费多项式时间,因为会有很多查询.关键是k很小.在我的应用程序中,k <= 5且N为数千.面具有很多1; 你可以假设它是从64位整数的空间中均匀绘制的.

更新:

这是一个示例数据集和一个在Linux上运行的简单基准程序:http://up.thirld.com/binmask.tar.gz.对于large.in,N = 3779且k = 3.第一行是N,后跟N个无符号的64位整数,表示元素.编译make.运行./benchmark.e >large.out以创建真正的输出,然后您可以对其进行区分.(掩码是随机生成的,但随机种子是固定的.)然后find_first() …

algorithm optimization search bitmask data-structures

14
推荐指数
1
解决办法
3109
查看次数

显示本地证书文件的整个证书链

我有一个保存在本地文件中的证书(例如这个).openssl从命令行使用,如何显示从此证书到根CA的整个链?我试过了:

openssl verify -verbose -purpose sslserver -CApath /etc/ssl/certs InCommonServerCA.txt
Run Code Online (Sandbox Code Playgroud)

得到这个令人困惑的输出,似乎只显示叶证书:

InCommonServerCA.txt: C = US, O = Internet2, OU = InCommon, CN = InCommon Server CA
error 26 at 0 depth lookup:unsupported certificate purpose
OK
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

ssl openssl certificate

14
推荐指数
2
解决办法
3万
查看次数

django多对多字段:仅预取主键

我正在尝试优化Django应用程序的数据库查询.这是一个简化的例子:

class Label(models.Model):
    name = models.CharField(max_length=200)
    # ... many other fields ...

class Thing(models.Model):
    name = models.CharField(max_length=200)
    labels = models.ManyToManyField(Label)
Run Code Online (Sandbox Code Playgroud)

我有一个函数可以获取所有Labels和Things并将它们放入JSON数据结构中,其中s使用s(主键)Thing引用Labels id.像这样的东西:

{
    'labels': [
        { 'id': 123, 'name': 'label foo' },
        ...
    ],
    'things': [
        { 'id': 45, 'name': 'thing bar', 'labels': [ 123, ... ] },
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

使用Django获得这种数据结构的最有效方法是什么?假设我有L Label s和T Thing s,平均值Thingx Label s.

方法1:

data = {}
data['labels'] = [model_to_dict(label) for …
Run Code Online (Sandbox Code Playgroud)

python database django optimization django-queryset

8
推荐指数
1
解决办法
3288
查看次数

在numpy中,如何有效地列出所有固定大小的子矩阵?

我有一个任意的NxM矩阵,例如:

1 2 3 4 5 6
7 8 9 0 1 2
3 4 5 6 7 8
9 0 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

我想得到这个矩阵中所有3x3子矩阵的列表:

1 2 3       2 3 4               0 1 2
7 8 9   ;   8 9 0   ;  ...  ;   6 7 8
3 4 5       4 5 6               2 3 4
Run Code Online (Sandbox Code Playgroud)

我可以用两个嵌套循环来做到这一点:

rows, cols = input_matrix.shape
patches = []
for row in np.arange(0, rows - 3):
    for col in np.arange(0, cols - 3):
        patches.append(input_matrix[row:row+3, …
Run Code Online (Sandbox Code Playgroud)

python numpy matrix

6
推荐指数
1
解决办法
947
查看次数