小编str*_*iwi的帖子

我应该避免Prolog中的尾递归吗?

我正在通过"现在学习Prolog"在线书籍来获取乐趣.

我正在尝试编写一个谓词,该谓词遍历列表的每个成员并使用累加器向其中添加一个谓词.我已经很容易做到了,没有尾递归.

addone([],[]).
addone([X|Xs],[Y|Ys]) :- Y is X+1, addone(Xs,Ys).
Run Code Online (Sandbox Code Playgroud)

但我已经读过,出于性能原因,最好避免这种类型的递归.这是真的?总是使用尾递归被认为是"好习惯"吗?是否值得努力使用累加器来养成良好的习惯?

我试图将此示例更改为使用累加器,但它会反转列表.我怎么能避免这个?

accAddOne([X|Xs],Acc,Result) :- Xnew is X+1, accAddOne(Xs,[Xnew|Acc],Result).
accAddOne([],A,A).
addone(List,Result) :- accAddOne(List,[],Result).
Run Code Online (Sandbox Code Playgroud)

tail-recursion prolog accumulator tailrecursion-modulo-cons

13
推荐指数
2
解决办法
5151
查看次数

Django自定义用户admin change_password

我成功地使用了django的自定义用户模型.最后一件工作是"AdminChangePasswordForm",供超级用户更改任何用户密码.

目前来自admin:myapp:user的更改密码链接给出了404

答案.

覆盖get_urls

并覆盖UserChangeForm以获得正确的URL.

python django

5
推荐指数
1
解决办法
1421
查看次数

迭代django对象以更新它们的最有效方法是什么?

所以我有一个查询集要更新

stories = Story.objects.filter(introtext="")
for story in stories:
    #just set it to the first 'sentence'
    story.introtext = story.content[0:(story.content.find('.'))] + ".</p>" 
    story.save()
Run Code Online (Sandbox Code Playgroud)

而save()操作完全破坏了性能。并且在进程列表中,“ ./ manage.py shell”有多个条目,是的,我通过django shell运行了它。

但是,过去我运行过不需要使用save()的脚本,因为它更改了许多字段。这些脚本非常出色。我的项目有此代码,这可能与为什么这些脚本如此出色有关。

@receiver(signals.m2m_changed, sender=Story.tags.through)
def save_story(sender, instance, action, reverse, model, pk_set, **kwargs):
    instance.save()
Run Code Online (Sandbox Code Playgroud)

有效更新大型查询集(10000+)的最佳方法是什么?

python django django-database

4
推荐指数
1
解决办法
1563
查看次数

django taggit similar_objects查询速度很慢

我正在尝试选择3个最近发布的项目,其中任何标签与当前项目类似(以及其他一些过滤器)无法找到有效的方法,数据库中有很多"项目".

from taggit_autosuggest.managers import TaggableManager

class Item(models.Model):
    publish_date = DateField()
    tags = TaggableManager()
    sites = ManyToManyField(Site)

def my_view():
    ...
    current_item = #get current item
    related_items = Item.active_objects.filter(
        sites=current_site,
        id__in=[x.id for x in current_item.tags.similar_objects()]
        ).order_by('-publish_date')[:3]
    ...
Run Code Online (Sandbox Code Playgroud)

但是这会从similar_objects()方法引起相当大的性能问题.current_item具有的标签越多,指数越差

# Query_time: 20.613503  Lock_time: 0.000182 Rows_sent: 83  Rows_examined: 7566504
SELECT `taggit_taggeditem`.`content_type_id`, `taggit_taggeditem`.`object_id`, COUNT(`taggit_taggeditem`.`id`) AS `n` FROM `taggit_taggeditem` WHERE (NOT (`taggit_taggeditem`.`object_id` = 205636  AND `taggit_taggeditem`.`content_type_id`
 = 11 ) AND (`taggit_taggeditem`.`tag_id`) IN (SELECT DISTINCT `taggit_tag`.`id` FROM `taggit_tag` INNER JOIN `taggit_taggeditem` ON ( `taggit_tag`.`id` = `taggit_taggeditem`.`tag_id` ) …
Run Code Online (Sandbox Code Playgroud)

python mysql django django-taggit

0
推荐指数
1
解决办法
883
查看次数