Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Use more buffers (redux) - #128

Merged
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122
Nov 27, 2018
Merged

Use more buffers (redux)#128
alimanfoo merged 23 commits into
zarr-developers:masterfrom
alimanfoo:use-buffers-redux-alimanfoo-20181122

Conversation

@alimanfoo

@alimanfooalimanfoo commented Nov 22, 2018

Copy link
Copy Markdown
Member

Based on work in #121, trying to make a clean split between PY2 and PY3 code paths, and make function naming more intuitive.

TODO:

  • Unit tests and/or doctests in docstrings
  • tox -e py37 passes locally
  • tox -e py27 passes locally
  • Docstrings and API docs for any new/modified user-facing classes and functions
  • Changes documented in docs/release.rst
  • tox -e docs passes locally
  • AppVeyor and Travis CI passes
  • Test coverage to 100% (Coveralls passes)

@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from ceb7ccc to 0153531CompareNovember 22, 2018 23:39

@jakirkhamjakirkham left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for playing around with this problem as well @alimanfoo. Seems you are encountering the same subtleties I ran into. Left some comments below, but wouldn't take them too seriously. They are more intended as advice. Completely understand this is still a work in progress at this stage.

Would just highlight one point that comes up below and have generally learned by playing with this problem. Namely NumPy ndarrays end up being a great solution to use for all data in codecs. They support both buffer protocols, they support more types out-of-the-box, and they are easier for us and new users to the codebase to work with. This saves on compat code, work the same on Python 2/3, are easily handled by builtin compressors, and make things like casting, reshaping, and getting bytes trivial. In short, a lot of mileage can be gotten out of ndarrays.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks @jakirkham for the comments, this is a tricky one to get right.

FWIW I think the key issue here is that many codecs require an input that, under Python 3, exposes a new-style buffer interface onto a C contiguous block of memory. E.g., things like ZLib, BZ2 and LZMA.

A blocker from just passing a numpy array to these functions is the datetime & timedelta datatypes which you can't take a memoryview of.

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

@jakirkham

Copy link
Copy Markdown
Member

If I included a conversion from datetime or timedelta to int64 within the ensure_contiguous_ndarray() function, then it would be possible to use that function everywhere instead of either ensure_memoryview() or ensure_buffer(), and so delete those two functions. Maybe that would be a good idea.

This is my temptation as well. Let's go for it. 😄

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Let me know what you think.

@alimanfooalimanfoo changed the title WIP Use more buffers (redux)Use more buffers (redux)Nov 23, 2018
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 047ac0a to f4f6f5dCompareNovember 23, 2018 12:17
@alimanfooalimanfoo mentioned this pull request Nov 23, 2018
8 tasks
Comment threadnumcodecs/categorize.py Outdated
Comment threadnumcodecs/checksum32.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

OK, 'tis done! I'm using ensure_contiguous_ndarray() everywhere now. ensure_memoryview() and ensure_buffer() are gone.

Beautiful! Thanks for doing that. 😄

There were still some quirks in the BZ2 and GZip codecs that required an explicit conversion to memoryview, but I figure that's OK.

Yeah, I ran into these two as well. Agree this seems fine.

Let me know what you think.

Added a few more comments above in our existing threads to keep continuity with the existing discussion. A couple other comments above as well. For the most part these are moving to minor points. IOW this is looking pretty good.

Comment threadnumcodecs/compat.py Outdated
@alimanfoo
alimanfooforce-pushed the use-buffers-redux-alimanfoo-20181122 branch from 1acb560 to 5084c56CompareNovember 27, 2018 01:53
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Hi @jakirkham, after some thrashing around I think I have basically converged on something very similar to what you have in #121. There are some small differences which I'm more than happy to discuss. I've also pushed on and refactored the buffer compatibility code in the cython modules, to re-use the new compat functions. I still have to address the point you raised about dealing with unicode arrays, but apart from that, I'd be very grateful if you could take a look and see if there's anything you think I've missed, or anything you think should be done differently.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Latest commit disallows unicode array.array, seemed like it was not worth the effort to support it.

@alimanfoo

Copy link
Copy Markdown
MemberAuthor

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121, mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why. I believe that the approaches taken here and in #121 are essentially the same, with the main differences being in function naming and some minor implementation details. Please let me know if any objections. Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py Outdated
Comment threadnumcodecs/compat.py
Comment threadnumcodecs/gzip.py Outdated
@jakirkham

Copy link
Copy Markdown
Member

Had some pretty minor comments above. Think this is basically done at this stage.

In the interests of getting to a 0.6 release asap, I'd like to suggest we move forward with this PR instead of #121...

Sounds good to me.

...mainly for the reason that I've had the chance to add in a bit more documentation and comments, so hopefully when we or someone else needs to revisit this in future, they should be able to comprehend what is being done and why.

I think the test coverage and function naming were also better here. The API has also improved generally.

Whatever PR we take forward, primary credit for this work should go to @jakirkham.

Thanks for working on this as well. It has come a long way since that PR.

@jakirkhamjakirkham added this to the 0.6.0 milestone Nov 27, 2018
@alimanfoo

Copy link
Copy Markdown
MemberAuthor

Thanks again @jakirkham for the review. Your suggestions are all good and I've gone with them in latest commits. Thanks also for bottoming out some really gnarly Python quirks, it is amazing how deep the rabbit hole goes!

If CI passes I propose to merge if no objections.

@alimanfoo
alimanfoo merged commit df60e2f into zarr-developers:masterNov 27, 2018
@alimanfoo
alimanfoo deleted the use-buffers-redux-alimanfoo-20181122 branch November 27, 2018 23:16
@jakirkhamjakirkham mentioned this pull request Nov 27, 2018
8 tasks
@jakirkham

Copy link
Copy Markdown
Member

Thanks @alimanfoo! 🎉

Agree this looks great. Thanks for your hard work here. 😄

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alimanfoo@jakirkham