我可以看到,ReentrantLock快于50%左右synchronized,并AtomicInteger快100%.为什么这三种同步方法的执行时间存在差异:synchronized块ReentrantLock和AtomicInteger(或Atomic包中的任何类).
除了这些之外还有其他流行的和扩展的同步方法吗?
假设我有一个我要排序的项目列表:items = [ item1, item2, item3 ].我想用来对它们进行排序的属性是item.data.value,所以我通常会去:
sorted(items, key=attrgetter('data.value'))
Run Code Online (Sandbox Code Playgroud)
那工作得很好.但是,data实际上None显然我无法访问value.
你通常如何处理这样的场景?
我有一个我想要排序的元素列表,但我不想对所有这些元素进行排序,只有那些具有特定状态的元素.例如,假设我有一个peole列表:
lst = [Mary, John, Anna, Peter, Laura, Lisa, Steve]
Run Code Online (Sandbox Code Playgroud)
我们中的一些人有工作,比方说[Anna, Lisa, Steve].我希望按照它们工作的小时数对它们进行排序(升序)并将它们移动到列表的开头,同时保持其余的顺序完全相同.那么让我们说他们工作的小时数如下:
Anna.job.hours # 10
Lisa.job.hours # 5
Steve.job.hours # 8
Run Code Online (Sandbox Code Playgroud)
部分排序后,列表将如下所示:
[Lisa, Steve, Anna, Mary, John, Peter, Laura]
Run Code Online (Sandbox Code Playgroud)
当然,我可以创建两个原始列表中的新列表,对我想要排序的列表进行排序,然后将它们组合在一起以实现我的目标:
with_job = [person for person in lst if person.job]
without_job = [person for person in lst if not person.job]
with_job.sort(key=lambda p: p.job.hours)
lst = with_job + without_job
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有一种方法式的Pythonic方法.
我有Formwith a ModelChoiceField,它被用作form_classa 中的the FormView。
选择字段必须填充与request对象绑定的信息。
我们总结一下:
class MyFormView(FormView):
# I need to pass `request.user` and a value
# derived from `request.GET['pk']` to the form
form_class = MyForm
class MyForm(Form):
choices = ModelChoiceField(queryset=MyChoice.objects.none())
def __init__(self, user, number, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['choices'] = MyChoice.objects(number=number, owner=user)
Run Code Online (Sandbox Code Playgroud)
创建实例时,我需要做什么才能将该数据传递到表单?
我尝试覆盖,get_form但我不确定这是执行此操作的正确方法:
def get_form(self, form_class):
user = self.request.user
number = SomeModel.objects.get(self.GET['pk']).number
return form_class(user, number, **self.get_form_kwargs())
Run Code Online (Sandbox Code Playgroud) 我正在尝试过滤Match某天计划的es。我不能只是这样做:
match_queryset.filter(start=date)
Run Code Online (Sandbox Code Playgroud)
因为它也会按时间过滤,但是我可以这样做:
match_queryset.filter(start__year=a_date.year, start__month=a_date.month, start__day=a_date.day)
Run Code Online (Sandbox Code Playgroud)
但这太复杂了,我觉得可能有一种更简单的方法。
然后,我还可以使用范围:
t0 = datetime.datetime.combine(a_date, datetime.time(0, 0))
t1 = datetime.datetime.combine(a_date, datetime.time(23, 59, 59))
match_queryset.filter(start__gte=t0, start__lte=t1)
Run Code Online (Sandbox Code Playgroud)
但这似乎是一个过大的选择,并且可能会生成效率低下的查询。
我不能只是查询以实际日期为目标吗?就像是:
# this of course doesn't work
match_queryset.filter(start__date=date)
Run Code Online (Sandbox Code Playgroud)
无需说我已经尝试寻找解决方案,但找不到任何解决方案。
我最近将 Django 升级到 1.8 并设置了一个新的开发数据库以重新开始。迁移和依赖关系进展顺利,避免了您遇到的常见错误,最终解决了。该应用程序现在在本地运行良好。
但是,在尝试运行测试时出现错误:
python manage.py test
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
django.db.utils.ProgrammingError: relation "auth_user" does not exist
Run Code Online (Sandbox Code Playgroud)
不用说,Django 的 auth 模块确实是在应用程序中安装和迁移的,所以我不确定这是怎么回事。
这是完整的堆栈跟踪,以防您需要查看它,但它并没有说明任何对我找出此错误原因有帮助的内容:
Traceback (most recent call last):
File "C:/Users/dabadaba/PycharmProjects/dogpatchsports_com/mysite/manage_sched_dev.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\__init__.py", line 354, in execute_from_command_line
utility.execute()
File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\__init__.py", line 346, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\commands\test.py", line 30, in run_from_argv
super(Command, self).run_from_argv(argv)
File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\base.py", line 394, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\commands\test.py", line 74, in execute
super(Command, self).execute(*args, **options)
File "C:\Users\dabadaba\Envs\django18\lib\site-packages\django\core\management\base.py", line 445, in execute
output = …Run Code Online (Sandbox Code Playgroud) 我在为我的应用程序运行测试时遇到了一些麻烦,并且在上一篇文章中设法解决了这些问题。
现在执行的python manage.py test过程不会引起任何错误,但是它会卡在数据库创建中:
如我在pgAdmin中所见,当测试数据库不存在时,它确实会创建,但是它被此消息卡在进程中:
Creating test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
它永远都停留在这里,因此当我手动完成该过程并test再次运行时,它说数据库存在,并提示我删除它并重新创建或取消该过程。我键入“是”,并且该过程再次被其他消息卡住:
Destroying old test database 'default'...
Run Code Online (Sandbox Code Playgroud)
使用pgAdmin打开时,我无法立即看到任何新test_dbname数据库,但是如果我关闭并再次打开它,就test_dbname可以了,但是test任务只是卡在那儿,无法进行...
解决此问题的方法是此解决方案,即禁用迁移。这样,它就不再卡在这些消息上,并且运行默认测试。
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
Run Code Online (Sandbox Code Playgroud)
但是,这似乎是一个不好的解决方案和作弊手段。运行测试时一定有充分的理由要运行迁移,所以我看不出禁用它们的充分理由。
对于需要在特定模块中测试的每个不同组件,我都有一个专用的测试类。所有这些测试都围绕相同的对象/上下文,因此如果没有创建相应的对象并将其插入测试数据库,然后为每个测试类删除,则可以提高性能:
class ContextTest(TestCase):
fixtures = [...]
@classmethod
def setUpTestData(cls):
pass
# executes setUpTestData
class Component1Test(ContextTest):
pass
# executes setUpTestData again
class Component2Test(ContextTest):
pass
Run Code Online (Sandbox Code Playgroud)
有什么方法可以确保setUpTestData只运行一次,同时为了清楚起见将我的测试保留在不同的类下?
我正在尝试分析部分代码以减少针对数据库运行的查询数量,因此我配置了以下记录器,该记录器据称会记录针对数据库执行的每个原始 SQL 查询:
LOGGING = {
'version': 1,
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
}
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console']
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在逐行调试所述代码块,以慢慢检查正在记录的查询。问题在于 PyCharm 的调试器正在评估所涉及的QuerySets,因此对数据库运行查询并扭曲了我的分析。
有什么方法可以配置调试器,使其不会自动评估变量吗?或者本质上我可以通过任何其他方式分析每行代码产生的原始查询?
我正在测试该类的使用,AtomicInteger但增量似乎并未在互斥控制下应用.
这是我的测试:
static class AtomicIntegerRunnable implements Runnable
{
private static AtomicInteger x;
AtomicIntegerRunnable() {}
AtomicIntegerRunnable(AtomicInteger x)
{
this.x = x;
}
@Override
public void run()
{
System.out.println(x.get());
x.getAndIncrement();
}
}
public static void main(String[] args) {
ExecutorService e = Executors.newFixedThreadPool(n_whatever);
AtomicInteger x = new AtomicInteger();
int n = 10;
for (int i=0; i<n; i++) {
e.submit(new AtomicIntegerRunnable(x));
}
e.shutdown();
while (!e.isTerminated());
}
Run Code Online (Sandbox Code Playgroud)
在印刷品中,我得到了类似的东西
0 0 1 1 1 5 4 3 2 6
代替
0 1 2 3 …
python ×7
django ×6
django-1.8 ×4
concurrency ×2
java ×2
migration ×2
python-2.7 ×2
sorting ×2
debugging ×1
logging ×1
mutex ×1
testing ×1