Skip to content

Commit 8cf0bbd

Browse files
author
Nick Eubank
committed
Remove redundant copying
1 parent 0260b91 commit 8cf0bbd

File tree

3 files changed

+5
-17
lines changed

3 files changed

+5
-17
lines changed

pandas/core/generic.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,7 +1217,7 @@ def _slice(self, slobj, axis=0, kind=None):
12171217
def _set_item(self, key, value):
12181218

12191219
# If children are views, reset to copies before setting.
1220-
self._convert_views_to_copies()
1220+
self._execute_copy_on_write()
12211221

12221222
self._data.set(key, value)
12231223
self._clear_item_cache()
@@ -1231,23 +1231,13 @@ def _set_is_copy(self, ref=None, copy=True):
12311231
else:
12321232
self.is_copy = None
12331233

1234-
def _convert_views_to_copies(self):
1234+
def _execute_copy_on_write(self):
12351235

12361236
# Don't set on views.
1237-
if self._is_view and not self._is_column_view:
1237+
if (self._is_view and not self._is_column_view) or len(self._children) is not 0:
12381238
self._data = self._data.copy()
1239-
1240-
1241-
# Before setting values, make sure children converted to copies.
1242-
for child in self._children.valuerefs():
1243-
1244-
# Make sure children of children converted.
1245-
child()._convert_views_to_copies()
1246-
1247-
if child()._is_view and not child()._is_column_view:
1248-
child()._data = child()._data.copy()
1239+
self._children = weakref.WeakValueDictionary()
12491240

1250-
self._children = weakref.WeakValueDictionary()
12511241

12521242
def _add_to_children(self, view_to_append):
12531243
self._children[id(view_to_append)] = view_to_append

pandas/core/indexing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def _get_setitem_indexer(self, key):
115115

116116
def __setitem__(self, key, value):
117117
# Make sure changes don't propagate to children
118-
self.obj._convert_views_to_copies()
118+
self.obj._execute_copy_on_write()
119119

120120
indexer = self._get_setitem_indexer(key)
121121
self._setitem_with_indexer(indexer, value)

pandas/tests/test_generic.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,7 +1745,6 @@ def test_copy_on_write(self):
17451745

17461746
for v in views.keys():
17471747
tm.assert_frame_equal(views[v], copies[v])
1748-
self.assertFalse(views[v]._is_view)
17491748

17501749
# Test different forms of value setting
17511750
# all trigger conversions
@@ -1768,7 +1767,6 @@ def test_copy_on_write(self):
17681767

17691768
for v in views.keys():
17701769
tm.assert_frame_equal(views[v], copies[v])
1771-
self.assertFalse(views[v]._is_view)
17721770

17731771
########
17741772
# No Backward Propogation

0 commit comments

Comments
 (0)