Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[mypyc] Speed up native-to-native calls using await#19398

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
JukkaL merged 7 commits intomasterfrommypyc-await-optimize-2
Jul 8, 2025

Conversation

@JukkaL
Copy link
Collaborator

When calling a native async function usingawait, e.g.await foo(), avoid raisingStopIteration to pass the return value, since this is expensive. Instead, pass an extraPyObject ** argument to the generator helper method and use that to return the return value. This is mostly helpful when there are many calls using await that don't block (e.g. there is a fast path that is usually taken that doesn't block). When awaiting from non-compiled code, the slow path is still taken.

This builds on top of#19376.

This PR makes this microbenchmark about 3x faster, which is about the ideal scenario for this optimization:

import asynciofrom time import timeasync def inc(x: int) -> int:    return x + 1async def bench(n: int) -> int:    x = 0    for i in range(n):        x = await inc(x)    return xasyncio.run(bench(1000))t0 = time()asyncio.run(bench(1000 * 1000 * 200))print(time() - t0)

@JukkaLJukkaL merged commit4a427e9 intomasterJul 8, 2025
13 checks passed
@JukkaLJukkaL deleted the mypyc-await-optimize-2 branchJuly 8, 2025 16:46
JukkaL added a commit that referenced this pull requestJul 9, 2025
Call the generator helper method directly instead of calling`PyIter_Next` when calling a native generator from a native function.This way we can avoid raising StopIteration when the generator isexhausted. The approach is similar to what I used to speed up callsusing await in#19398. Refer to that PR for a more detailed explanation.This helps mostly when a generator produces a small number of values,which is quite common.This PR improves the performance of this microbenchmark, which is aclose to the ideal use case, by about 2.6x (now 5.7x faster thaninterpreted):```from typing import Iteratordef foo(x: int) -> Iterator[int]:    for a in range(x):        yield adef bench(n: int) -> None:    for i in range(n):        for a in foo(1):            passfrom time import timebench(1000 * 1000)t0 = time()bench(50 * 1000 * 1000)print(time() - t0)```
hauntsaninja pushed a commit that referenced this pull requestNov 23, 2025
This is another problem caused by#19398 and a missing part of#20254 cc@JukkaL@hauntsaninja there is a small chance this may be related to theproblems with black.
p-sawicki pushed a commit to p-sawicki/mypy that referenced this pull requestNov 25, 2025
This is another problem caused bypython#19398 and a missing part ofpython#20254 cc@JukkaL@hauntsaninja there is a small chance this may be related to theproblems with black.
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

@jhancejhancejhance approved these changes

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

3 participants

@JukkaL@jhance

[8]ページ先頭

©2009-2025 Movatter.jp